尝试使用子进程和父进程打开文件时,继续遇到seg错误?

时间:2016-01-31 21:27:00

标签: c fork fopen fgets pid

我正在尝试打开一个文本文件,并同时从文件中读取一个子进程和父进程,然后输出它们的PID,然后输出读取的行。除了我似乎做的事情,我不断得到一个段错误,甚至无法找到我的问题所在。

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;
}

1 个答案:

答案 0 :(得分:0)

您可能有两个错误:

  1. 您正在使用strtol()而未检查是否有argv[1]。你应该放一个警卫。
  2. 您没有正确使用fgets()。第一个参数必须是您自己分配的缓冲区,如:

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

    (最后,作为样式点,main()应返回int,而不是void。某些现代编译器不接受您的代码。)