父c中wait()的用途

父c中wait()的用途,c,linux,process,fork,wait,C,Linux,Process,Fork,Wait,我不熟悉linux和c中的进程。 我使用的是一个简单的例子: #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, const char * argv[]) { pid_t child_pid_or_zero = fork(); //fork returns twice if(child_pid_or_zero < 0) { //if fo

我不熟悉linux和c中的进程。 我使用的是一个简单的例子:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

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

pid_t child_pid_or_zero = fork(); //fork returns twice

if(child_pid_or_zero < 0)
{
    //if fork returns a number smaller than zero, something wrong happened
    perror("Something wrong happened\n");
    exit(-1);
}

if(child_pid_or_zero > 0)
{
    //if fork returns a number greater than zero, this is the parent process
    printf("I'm the parent, my pid is: %d\t My child pid is %d\n", getpid(), child_pid_or_zero);
    wait(NULL);
}

else
{
    //this means that fork now returned 0, the child process is running
    printf("I am the child with pid: %d\t My parent pid is: %d\n",child_pid_or_zero, getppid());

}


return 0;
}
如果我在

如果child\u pid\u或\u zero>0

会发生什么?我自己也试过了,显然,没有什么直接的区别。我们是否总是需要使用等待,还是这只适用于孩子应该执行繁重的计算等


提前感谢。

等待是为了收听状态更改并获取有关孩子的信息。状态更改是通过信号终止、停止或恢复的子级。等待允许系统释放与子级关联的资源。如果未执行等待,则终止的子级仍处于僵死状态

内核维护关于僵尸的最小信息集 进程PID,终止状态, 资源使用信息,以便允许父级稍后执行等待以获取有关子级的信息。只要 因为僵尸不会通过 等等,它将消耗内核进程表中的一个插槽,如果该表已满,则无法进一步创建 过程。如果父进程终止,则其 init1采用了僵尸子对象(如果有的话),它会自动等待移除僵尸

系统调用通常用于查找子进程的状态是否已更改,即它是否仍在运行、是否已退出等

另一个目的是避免过程。如果父进程不等待子进程,并且子进程在父进程之前退出,那么它将成为一个僵尸进程。因此,等待调用用于获取进程并释放与该进程相关联的系统资源


想象一下,如果父进程是一个长时间运行的进程,并定期创建几个子进程,那么所有僵尸进程都会在进程表中有条目,这是对系统资源的不必要使用。

在fork之后,您将有两个独立的进程

在等待调用中,您告诉父进程等待子进程终止


在本例中,由于两个进程没有相互交互,因此没有任何变化,因此父进程可以在创建子进程并打印字符串后退出,但在父进程必须等待子进程执行某些操作,然后可能会将一些值返回给父进程的场景中,这将变得非常有用

编译时,始终启用所有警告,然后修复这些警告。为了便于阅读和理解:始终缩进代码。在每个左大括号“{”之后缩进。在每个右大括号“}”之前取消缩进。子进程不应重新输入父代码。即用“退出”结束子进程你能再详细一点吗?比如提供一个例子,这可能导致这些僵尸的出现?在你的例子中,这很简单。在父进程中,如果hild_pid_或_zero>0部分,则添加sleep10;作为第一句话。然后执行您的代码,在终端的另一个窗口中,如果您运行ps-af,您将看到僵尸进程,因为父进程还没有收获,子进程已经退出。这不太正确。1除非重新启动,否则用户无法杀死僵尸。2初始化进程不会执行等待,因此僵尸将永远存在,或者直到重新启动发生。当其父进程退出时,创建了一个僵尸进程,因此不再存在的父进程无法将其删除。僵尸将成为init进程的子进程,并永远存在