分段故障归档睡眠功能

时间:2011-03-06 13:22:17

标签: c linux file-io

嗨,每一个我都遇到了问题。我正在使用睡眠功能。我有文件,我打开5秒后读取所有数据并显示它。它运行了几次给分段故障我不知道为什么它发生。我认为程序文件没有任何问题其他明智的它必须热运行 谢谢  请帮助我 这是代码

#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
//====================================================================================

1 个答案:

答案 0 :(得分:4)

elseif(fsize==0)条件的csvwrite()分支不fclose(fe)。任何一个进程可以同时打开的文件数量有限制;如果你拨打这么多次,你就会达到限制,下一个fopen()会返回NULL(而errno会设置为EMFILE - “打开太多文件“)。

这可能是也可能不是问题,所以这里有一些更一般的建议:

  1. 使用调试器。如果你不知道怎么做,你应该学习!例如:

    $ 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
    $
    

    不是很有帮助。但是使用-g进行编译并使用gdb

    运行它

    $ 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 
    
    ...它会显示失败的行:

    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
    $ 
    
  2. 编译并启用警告(正如我上面用-Wall标志所做的那样)。编译器能够发现很多愚蠢的东西,但你必须要问它。

  3. 尝试明智地缩进代码。可读代码更容易调试。

  4. 请记住检查返回值。 fopen()特别是因为与您的计划无关的任何原因而失败。

  5. 不要写大量实际相同的代码。如果您不得不多次执行相同的工作,请考虑将其分解为单独的功能。