Collapsible program: segmentation error (dropping kernel)

I am currently writing a program that will read the / proc / stat file and parse every line that will be stored as tokens, and then processed and displayed in the output table. I am at the stage when I managed to get the program to parse the program, but when it comes to storing tokens in different values โ€‹โ€‹of the array, I get an error: segmentation error (dropping the kernel). I'm not sure what causes this, since I already allocated memory. I also pretty start with C.

//standard input/output file to help with io operations #include<stdio.h> //standard library files to help with exit and other standard functions #include<stdlib.h> //header file for usleep function #include <unistd.h> #include <string.h> //header file for strtok function int main() { //FILE pointer will need to be declared initially, in this example the name is fp FILE *fp; //A character pointer that will store each line within the file; you will need to parse this line to extract useful information char *str = NULL; //size_t defined within C is a unsigned integer; you may need this for getline(..) function from stdio.h to allocate buffer dynamically size_t len = 0; //ssize_t is used to represent the sizes of blocks that can be read or written in a single operation through getline(..). It is similar to size_t, but must be a signed type. ssize_t read; float cpu_line1[4]; float cpu_line2[4]; float cpu_line3[4]; float cpu_line4[4]; float cpu_line5[4]; float page[2]; float swap[2]; float intr; float ctxt; float btime; //a variable declared to keep track of the number of times we read back the file unsigned int sample_count = 0; //opening the file in read mode; this file must be closed after you are done through fclose(..); note that explicit location of the file to ensure file can be found fp = fopen("/proc/stat", "r"); //checking if the file opening was successful; if not we do not want to proceed further and exit with failure code right away if(fp == NULL) { exit(EXIT_FAILURE); } int i = 0; char **string = NULL; //declaration of string string = (char**)malloc(10*sizeof(char*)); //assign space for 10 pointers to array for (i=0; i<10; i++) //allocate 50 bytes to each string in the array { string[i] = (char*)malloc(50*sizeof(char)); } char *s = NULL; //a loop that will read one line in the file at a time; str will read the line; len will store the length of the file while(1) { printf("\e[1;1H\e[2J"); //this line will make sure you have cleared the previous screen using C powerful format specifiers printf("----------------------------------------------------------------\n");//used for presentation printf("Sample: %u\n", sample_count); //showing the sample count int i = 0; //counter while ((read = getline(&str, &len, fp)) != -1) { // printf("Retrieved line: \n%sof length: %zu, allocated buffer: %u :\n", str, read, (unsigned int) len); s = strtok(str, " "); printf("Test program: %s\n", s); } if (i=0) { sprintf(string[0], s); cpu_line1[0] = atoi(strtok(NULL, " ")); cpu_line1[1] = atoi(strtok(NULL, " ")); cpu_line1[2] = atoi(strtok(NULL, " ")); cpu_line1[3] = atoi(strtok(NULL, " ")); } if (i=1) { sprintf(string[1], s); cpu_line2[0] = atoi(strtok(NULL, " ")); cpu_line2[1] = atoi(strtok(NULL, " ")); cpu_line2[2] = atoi(strtok(NULL, " ")); cpu_line2[3] = atoi(strtok(NULL, " ")); } if (i=2) { sprintf(string[2], s); cpu_line3[0] = atoi(strtok(NULL, " ")); cpu_line3[1] = atoi(strtok(NULL, " ")); cpu_line3[2] = atoi(strtok(NULL, " ")); cpu_line3[3] = atoi(strtok(NULL, " ")); } if (i=3) { sprintf(string[3], s); cpu_line4[0] = atoi(strtok(NULL, " ")); cpu_line4[1] = atoi(strtok(NULL, " ")); cpu_line4[2] = atoi(strtok(NULL, " ")); cpu_line4[3] = atoi(strtok(NULL, " ")); } if (i=4) { sprintf(string[4], s); cpu_line5[0] = atoi(strtok(NULL, " ")); cpu_line5[1] = atoi(strtok(NULL, " ")); cpu_line5[2] = atoi(strtok(NULL, " ")); cpu_line5[3] = atoi(strtok(NULL, " ")); } if(i=5) { sprintf(string[5], s); page[0] = atoi(strtok(NULL, " ")); page[1] = atoi(strtok(NULL, " ")); } if(i=6) { sprintf(string[6], s); swap[0] = atoi(strtok(NULL, " ")); swap[1] = atoi(strtok(NULL, " ")); } if(i=7) { sprintf(string[7], s); intr = atoi(strtok(NULL, " ")); } if(i=8) { sprintf(string[8], s); ctxt = atoi(strtok(NULL, " ")); } if(i=9) { sprintf(string[9], s); btime = atoi(strtok(NULL, " ")); } printf("----------------------------------------------------------------\n"); //used for presentation usleep(500000);//this will ensure time delay rewind(fp);//rewind the file pointer to start reading from the beginning sample_count++;//update the sample count } //Frees pointers to make program memory efficient free(str); for (i=0; i <10; i++) { free(string[i]); } //once you are done, you should also close all file pointers to make your program memory efficient fclose(fp); return 0; 

}

EDIT Here is a copy of what the program looks like when you run it in Cygwin


Example: 0

Testing Program: cpu

Test Program: cpu0

Test Program: cpu1

Test Program: cpu2

Test Program: cpu3

Testing program: page

Testing program: swap

Test program: intr

Test Program: ctxt

Test Program: btime

Segmentation error (kernel flushing)

+5
source share
3 answers

As mentioned in other underders, you should replace if(i=0) with if(i==0) .

You get a segmentation fault because strtok () returns NULL, and therefore atoi () gets NULL as a parameter:

  cpu_line1[0] = atoi(strtok(NULL, " ")); cpu_line1[1] = atoi(strtok(NULL, " ")); cpu_line1[2] = atoi(strtok(NULL, " ")); cpu_line1[3] = atoi(strtok(NULL, " ")); 

This code works fine if there are enough tokens for analysis. But it seems like you are too often trying to get the next token.

You should check if the return value of strtok () is NULL before passing it to atoi (). I suggest using loops to simplify the code and applying a NULL check for every use of atoi ().

Here is a simple check example:

 char* token = strtok(NULL, " "); if(token != NULL) cpu_line1[0] = atoi(token); 

This should solve the problem with the segmentation error if you add a check for each call to strtok ().

+1
source

In addition, your conditions are incorrect:

 if (i = 1) { // do something. } 

This assigns a value of 1 << 22> instead of comparing with 1 . Try the condition i == 1 .

+3
source

Not sure why segmentation error, but I can say that if you write

 if (i=0) //it means assign the value 0 to i and if the value would be different from zero, follow the "then" branch if (i==0) //is compare i to 0 and if true follow the "then" branch 

So, all if they are mistaken.

Hope this helps :)

+3
source

Source: https://habr.com/ru/post/1238540/


All Articles