Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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 为什么在父进程调用wait()函数之前子进程不退出?_C_Linux_Unix_Fork_Wait - Fatal编程技术网

C 为什么在父进程调用wait()函数之前子进程不退出?

C 为什么在父进程调用wait()函数之前子进程不退出?,c,linux,unix,fork,wait,C,Linux,Unix,Fork,Wait,我正在开发一个c程序,它使用fork()和wait()调用,首先我创建了五个子进程,然后调用了wait()五次。每当我执行程序时,它都会在从第一个for循环显示的第二个for循环中打印相同的子进程id。在调用wait()函数之前,从未退出子进程。为什么会这样?为什么cpid总是打印之前显示的确切子进程id 代码: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sy

我正在开发一个c程序,它使用
fork()
wait()
调用,首先我创建了五个子进程,然后调用了
wait()
五次。每当我执行程序时,它都会在从第一个for循环显示的第二个for循环中打印相同的子进程id。在调用wait()函数之前,从未退出子进程。为什么会这样?为什么
cpid
总是打印之前显示的确切子进程id

代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main( )
{
    int child_pids[5];
    int i;
    printf("PARENT ID: %d \n", getpid());
    for(i=0;i<5;i++) {
        if(fork()==0) {
            printf("child(pid): %d of parent(pid): %d \n",getpid(),getppid());
            exit(0);
        }
    }
    for(i=0;i<5;i++) {
        int cpid=wait(NULL);
        printf("parent (pid): %d waited for child(pid): %d \n",getpid(),cpid);
    }
    return 0;
}
#包括
#包括
#包括
#包括
int main()
{
int child_pids[5];
int i;
printf(“父ID:%d\n”,getpid());

对于(i=0;i在退出时,子进程将离开一个应该返回给父进程的退出状态。因此,当子进程完成时,它将变成一个僵尸

每当子系统退出或停止时,就会向父系统发送一个
SIGCHLD
信号。 父级可以使用系统调用
wait()
waitpid()
以及宏
WIFEXITED
WEXITSTATUS
来了解其停止子级的状态

如果父进程退出,那么您可以看到您的子进程仍然是僵尸进程(未设置子进程)

wait()
只是告诉您哪个孩子退出了,这样您就可以获得退出代码。如果您有更多的孩子在运行,那么当然,其他孩子也可以同时终止


如果您不关心退出状态,那么
wait()
就可以了,但是您仍然需要等待您启动的所有子进程。

“为什么cpid总是打印之前显示的确切子进程id?”父进程等待其子进程,即它所创建的进程。您希望看到什么不同?由于
wait(NULL)
仅在创建五个子进程之后才会被调用,为什么在
wait()
call?重新编译以将文档读取到
wait()之前没有退出任何子进程
wait
在子项退出之前不会返回父项。为什么您认为在
wait
之前没有子项退出?