子进程因错误而终止

时间:2015-05-08 20:06:56

标签: c fork exit

我在尝试使用fork()和exit()函数进行课程作业时遇到了问题。问题是我的子进程在正确完成时会以错误结束。这是我的代码:

{{1}}

我总是得到一个 Child错误警告。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您的诊断"儿童因错误而终止"是产生它的条件的错误表征。如果 it 有错误,wait()函数返回-1;如果调用进程没有要等待的子节点或者函数被信号中断,就会发生这种情况。

在你的情况下,原因是前者。成功时,fork()函数在子进程中返回0,并在父进程中返回新子进程ID(大于0的数字)。除此之外,这是父母和孩子如何区分哪个是哪个。您在孩子中调用wait(),该孩子没有自己的子进程。

请注意,孩子调用_exit()而非exit()可能会出现问题,因为前者会突然停止孩子(不会刷新打开的文件等),也会导致要发信号的父母(SIGCHILD)。这有时候是你想要的,但我不明白为什么你会在这种情况下想要它。

另请注意,wait()提供的状态会对收集过程的几个单独详细信息进行编码,包括但不限于其退出代码。除了通过为此目的提供的各种宏提取感兴趣的部分之外,对整个状态进行任何操作通常没有用。例如,要获取孩子的退出代码,您应该将状态传递给WEXITSTATUS()宏。在实际代码中,测试过程是否正常退出可能也是明智的,而不是因为信号而终止。 WEXITED()宏可以从状态中提取该信息。还有其他信息编码,以及其他用于提取它的宏。

因此,你可能会做得更好:

    int pid = fork();
    if (pid == 0) 
    {   
        /* child */
        puts("child: End child.\n");
        exit(0);
    }
    else if (pid > 0)
    {
        /* parent */
        int status = 0;
        if (wait(&status) == -1)
        {
            puts("parent: failed to wait.\n");
        }
        else 
        {
            printf("parent: child's exit code: %d\n", WEXITSTATUS(status));
        }   
        puts("parent: End parent.\n");        
    }
    else 
    {
        /* parent; error */
        puts("failed to fork.\n");
    }

答案 1 :(得分:0)

子进程中

ret应为0。在父进程中,ret应包含子级PID

 int ret = fork();
 if (ret < 0) { perror("fork"); exit(1); } /* handle fork error */
 if (ret == 0)
 {
    puts("child: End child.");
    _exit(0);
 }
 else 
 {
     /* <wait> code goes here */
 }