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 theif(fsize==0)
conditional incsvwrite()
does notfclose(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 nextfopen()
will returnNULL
(anderrno
will be set toEMFILE
- "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:
Not very helpful. But compile with
...and it will reveal the line where it fails:-g
and run it withgdb
: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.