Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在尝试打开具有子进程和父进程的文件时,是否一直出现seg错误?_C_Fork_Fopen_Fgets_Pid - Fatal编程技术网

C 在尝试打开具有子进程和父进程的文件时,是否一直出现seg错误?

C 在尝试打开具有子进程和父进程的文件时,是否一直出现seg错误?,c,fork,fopen,fgets,pid,C,Fork,Fopen,Fgets,Pid,我试图打开一个文本文件,让子进程和父进程从文件中一次读取一行,然后输出它们的PID,后跟读取的行。除了无论我看起来做什么,我总是遇到seg故障,甚至无法找到我的问题所在 int main(int argc, char *argv[]){ if(!argv[1]){ return 1; } int var1 = strtol(argv[1], NULL, 10); FILE *fp; fp = fopen("prog2Bout

我试图打开一个文本文件,让子进程和父进程从文件中一次读取一行,然后输出它们的PID,后跟读取的行。除了无论我看起来做什么,我总是遇到seg故障,甚至无法找到我的问题所在

int main(int argc, char *argv[]){

    if(!argv[1]){
             return 1;
    }

    int var1 = strtol(argv[1], NULL, 10);

    FILE *fp;
    fp = fopen("prog2Boutput.txt", "r");

    if (fp == NULL) {
            fprintf(stderr, "Can't open input file in.list!\n");
            exit(1);
    }

    int childP = fork();

    if(childP<0){
            fprintf(stderr, "fork failed\n");
            exit(1);
    }
    else if(childP==0){
            char* line = fgets(line,150, fp);
            printf("child: (pid:%d) (line:%s)\n", (int)getpid(), line);
    }
    else{
            char* line = fgets(line,150,fp);
            printf("parent: (pid:%d) (line:%s)\n", (int)getpid(), line);
    }

    fclose(fp);
    return 0;
}
intmain(intargc,char*argv[]){
如果(!argv[1]){
返回1;
}
int var1=strtol(argv[1],NULL,10);
文件*fp;
fp=fopen(“prog2Boutput.txt”,“r”);
如果(fp==NULL){
fprintf(stderr,“无法在.list中打开输入文件!\n”);
出口(1);
}
int childP=fork();

如果(childP您可能有两个错误:

  • 您使用的是
    strtol()
    ,没有检查是否存在
    argv[1]
    。您应该安装一个防护装置
  • 您没有正确使用
    fgets()
    。第一个参数必须是您自己分配的缓冲区,如:

    char line[200];
    char *cp = fgets(line, 150, fp);
    
  • 之后,
    cp
    将为0(当
    fgets()
    无法读取任何内容时),或者它将指向
    行的第一个字符


    (最后,作为风格点,
    main()
    应该返回
    int
    ,而不是
    void
    。一些现代编译器不会接受您的代码。)

    您认为调用
    fgets
    时,
    line
    指向什么?