segmentation fault filing sleep function
hi every one i am getting a problem. i am using a sleep function. i have file which i open after 5 sec read all data and display it. it run for few time the give segmentation fault i am not getting it why its happening.i think there is nothing wrong with the file of program other wise it must hot have run thanks kindly help me
here is the code#include<stdio.h>
#include <sys/stat.h>
#include<time.h>
#include<string.h>
void retrive()
{
FILE *fs;
char ch;
const int size =26;
const int size1 =3;
const int size2 =6;
char sourceip[size];char destip[size];char sourceport[size2];char destport[size2];
char sessionstart[size];char sessionend[size];char payload[size2];char sessionnum[size2];
while(-1)
{
fs = fopen ( "processpacketlib.txt","r" ) ;
if ( fs == NULL )
{
puts ( "Cannot open source file" ) ;
return 0;
}
int j;
int cnt =0;
printf("no of entries %d" , (noofentries("processpacketlib.txt")+1)/3);
//while(cnt<(noofentries("processpacketlib.txt")/3))
for(j=0;j<10;j++)
///ch= fgetc(fs);
//while(ch!=EOF)
{
int i=0;
printf("j = %d" ,j);
ch= fgetc(fs);
sourceip[i]=ch;
i++;
while ( ch!='\t')
{
ch = fgetc ( fs ) ;
sourceip[i]=ch;
i++;
}
sourceip[--i]='\0';
i=0;
//================================================
ch = fgetc ( fs ) ;
destip[i]=ch;
i++;
while ( ch!='\t' )
{
ch = fgetc ( fs ) ;
destip[i]=ch;
i++;
}
destip[--i]='\0';
i=0;
//=================================================
ch = fgetc ( fs ) ;
sourceport[i]=ch;
//printf("eh %c",eh[0]) ;
i++;
while (ch!='\t')
{
ch = fgetc ( fs ) ;
sourceport[i]=ch;
//printf("eh %c",eh[1]) ;
i++;
}
sourceport[--i]='\0';
i=0;
//=================================================
ch = fgetc ( fs ) ;
destport[i]=ch;
//printf("np %c",np[0]) ;
i++;
while (ch!='\t')
{
ch = fgetc ( fs ) ;
destport[i]=ch;
//printf("np %c",np[1]) ;
i++;
}
destport[--i]='\0';
i=0;
//===============================================
ch = fgetc ( fs ) ;
payload[i]=ch;
//printf("np %c",np[0]) ;
i++;
while (ch!='\t')
{
ch = fgetc ( fs ) ;
payload[i]=ch;
//printf("np %c",np[1]) ;
i++;
}
payload[--i]='\0';
i=0;
//==================================================
//==================================================
ch = fgetc ( fs ) ;
sessionnum[i]=ch;
//printf("np %c",np[0]) ;
i++;
while (ch!='\t')
{
ch = fgetc ( fs ) ;
sessionnum[i]=ch;
//printf("np %c",np[1]) ;
i++;
}
sessionnum[--i]='\0';
i=0;
//=================================================
ch = fgetc ( fs ) ;
sessionstart[i]=ch;
//printf("np %c",np[0]) ;
i++;
while (ch!='\n')
{
ch = fgetc ( fs ) ;
sessionstart[i]=ch;
//printf("np %c",np[1]) ;
i++;
}
sessionstart[--i]='\0';
i=0;
//======================================================
ch = fgetc ( fs ) ;
sessionend[i]=ch;
//printf("np %c",np[0]) ;
i++;
while (ch!='\n')
{
ch = fgetc ( fs ) ;
sessionend[i]=ch;
//printf("np %c",np[1]) ;
i++;
}
sessionend[--i]='\0';
ch = fgetc ( fs ) ;
//----------------------------------------------------*/
csvwrite(sourceip,destip,sourceport,destport,sessionstart,sessionend,payload,sessionnum);
printf("\nsip %s" , sourceip);
printf("\n dip %s" , destip);
printf("\nsource %s",sourceport);
printf("\ndest %s",destport);
printf("\nt pay %s",payload);
printf("\nt hdr %s",sessionnum);
printf("\nsession strat %s",sessionstart);
printf("\nsession end %s",sessionend);
printf("\n");
cnt++;
}// while ends
fclose(fs);
sleep(1);
}// outer infinite while ends
}
//==================================================================================
void csvwrite(char sourceip[],char destip[],char sourceport[],char destport[],char sessionstart[],char sessionend[],char payload[],char sessionnum[])
{int retvalue;
int pos=0;
char snum[5];char sstime[20];char payload1[10000] ;
struct tm tm;
time_t t;
char s[25]="Sat Feb 19 12:53:39 2011";
if (strptime(sessionstart, "%A %b %d %H:%M:%S %Y", &tm) != NULL)
tm.tm_isdst = -1;
t = mktime(&tm);
//if (t != -1)
//printf("seconds since the Epoch: %ld\n", (long) t);
char filename[35];
sprintf(filename,"%s%s%s%s",sourceip,"_",destip,".csv");
printf("filename %s",filename);
FILE *fe = fopen(filename,"a");
struct stat st;
stat(filename, &st);
int fsize = st.st_size;
printf("before file size %d\n\n\n" ,fsize);
if(fsize==0)
{
char stringtime[15];
fprintf(fe,"%s",sessionnum);
fprintf(fe,"%s"," ");
sprintf(stringtime,"%ld",(long)t);
fprintf(fe,"%s",stringtime);
fprintf(fe,"%s"," ");
fprintf(fe,"%s",payload);
fprintf(fe,"%s","\n");
fclose(fe);
struct stat st1;
stat(filename, &st1);
int fsize1 = st1.st_size;
printf("after file size %d\n\n\n" ,fsize1);
}
//fclose(filenname);
else
{
int count =noofentries(filename);
printf("count%d",count);
int i=0;
int k=0;
int len =0;
FILE *f1 = fopen(filename,"r");
//char snum[5];char sstime[20];char payload1[100000] ; int payloadentries=0;// change pasted below
while(k<count)
{char snum[5];char sstime[20];char payload1[100000] ; int payloadentries=0;
char ch;
ch= fgetc(f1);
pos++;
len++;
// printf("\nch = %c" ,ch);
snum[i]=ch;
i++;
while (ch!=' ')
{
ch = fgetc ( f1 ) ;
pos++;
len++;
snum[i]=ch;
// printf("ch %c",ch) ;
i++;
}
snum[--i]='\0';
i=0;
//--------------------------------------------
ch= fgetc(f1);
pos++;
len++;
// printf("\nch = %c" ,ch);
sstime[i]=ch;
i++;
while (ch!=' ')
{
ch = fgetc ( f1 ) ;
pos++;
len++;
sstime[i]=ch;
// printf("ch %c",ch) ;
i++;
}
sstime[--i]='\0';
i=0;
//---------------------------------------------
ch= fgetc(f1);
pos++;
len++;
// printf("\nch = %c" ,ch);
payload1[i]=ch;
i++;
while (ch!='\n')
{
ch = fgetc ( f1) ;
pos++;
len++;
payload1[i]=ch;
// printf("ch %c",ch) ;
i++;
if(ch==' ')
{
payloadentries++;
}
}
开发者_开发问答 payload1[--i]='\0';
i=0;
printf("\nsnum %s" ,snum);
printf("\nsstime %s" ,sstime);
printf("\npayload %s" ,payload1);
// retvalue=addpayload(sourceip,destip,sourceport,destport,t,payload,sessionnum,snum,sstime,payload1,payloadentries+1,pos,count,filename);
//printf("rettttttttttvalue %d" ,retvalue);
if ((retvalue==-2)||(retvalue==-1))
{
printf("\n\nBREAK\n\n ");
break;
}
k++;
}//while end
fclose(f1);
} //else end
}// function end
//====================================================================================
The else
branch of the if(fsize==0)
conditional in csvwrite()
does not fclose(fe)
. There is a limit on the number of files that can be opened by any one process at once; if you call this enough times, you'll hit the limit, and the next fopen()
will return NULL
(and errno
will be set to EMFILE
- "Too many open files").
That may or may not be the problem, so here's some more general advice:
Use a debugger. If you don't know how, you should learn! For example:
$ cat test.c #include <stdio.h> int main(void) { int a = 123, b, c; int *p = &a; int *q = NULL; b = *p; c = *q; printf("%d %d\n", b, c); return 0; } $ gcc -Wall -o test test.c $ ./test Segmentation fault $
Not very helpful. But compile with
-g
and run it withgdb
:$ gcc -g -Wall -o test test.c $ gdb ./test GNU gdb 6.8-debian Copyright (C) 2008 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i486-linux-gnu"... (gdb) run Starting program: /tmp/test
...and it will reveal the line where it fails:Program received signal SIGSEGV, Segmentation fault. 0x080483d4 in main () at test.c:10 10 c = *q; (gdb) quit The program is running. Exit anyway? (y or n) y $
Compile with warnings enabled (as I have done above with the
-Wall
flag). The compiler is capable of spotting quite a lot of silly things, but you have to ask it.Try indenting the code sensibly. Readable code is easier to debug.
Remember to check return values.
fopen()
in particular can fail for any number of reasons which are unrelated to your program.Don't write vast amounts of practically identical code. If you have to do the same job more than once, consider factoring it out into a separate function.
精彩评论