gpt4 book ai didi

c - Ubuntu 中的 wait() 函数

转载 作者:太空狗 更新时间:2023-10-29 11:05:16 28 4
gpt4 key购买 nike

我正在学习 Ubuntu 中的进程及其行为,但我对 wait() 有点困惑。所以我的问题是:

  1. 声明 while(wait(NULL)>0); 是如何工作的?
  2. wait() 中的 NULL 有什么用?

我已经在终端中看到了输出,但即使在执行 wait() 函数时,父级仍在执行并生成子级。 parent 的执行不应该停止吗?这是代码:

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

if(argc!=2)
{
printf("Please provide an argument in terminal! \n");
return 0;
}

int i,n=atoi(argv[1]);

for(i=0;i<n;i++)
{
childid=fork();

if(childid==0)
{
printf("Inside Child process! \n My id is %d\n",getpid());
break; // creating fan process structure
}
else
if(childid>0)
{
printf("Inside Parent Process! \n My id is %d\n",getpid());
}
}

while(wait(NULL)>0);

printf("After While Statment!\n My id is %d\n My parent ID is %d\n Child id is %d\n",getpid(),getppid(),childid);

我知道这是一个非常蹩脚的问题,但这是人们学习的方式:)

谢谢

最佳答案

声明 while(wait(NULL)>0); 是如何工作的?

函数wait,等待任何一个子进程的终止,如果成功,则返回终止的子进程的进程标识符。如果没有子进程,则返回-1。

在您的代码中,父进程基本上等待其创建的所有子进程终止。

对于任何子进程,此调用将立即返回 -1,因为他们尚未创建任何进程。

wait() 中的 NULL 的目的是什么?如果你看到wait的原型(prototype),是这样的,

pid_t wait(int *status);

父进程可以在变量 status 中获取子进程的退出状态(我们需要在等待函数中传递一个整数的地址,以更新该整数),然后 WEXITSTATUS 宏来提取该值。

传递 NULL(我们传递 NULL,因为变量是指针类型)意味着,程序员对该值不感兴趣,他正在将此通知给等待调用。

我稍微修改了您的代码,以解释等待函数的返回值和非 NULL 参数的使用。所有的 child 现在都返回一个值(循环索引 i),该值由父获取。

看看这是否有帮助,

#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>

int main(int argc, char *argv[])
{
pid_t childid;
int ret;
int status;

if(argc!=2)
{
printf("Please provide an argument in terminal! \n");
return 0;
}

int i,n=atoi(argv[1]);

for(i=0;i<n;i++)
{
childid=fork();

if(childid==0){
printf("Inside Child process! \n My id is %d\n",getpid());
break; // creating fan process structure
}
else if(childid > 0){
printf("Inside Parent Process! \n My id is %d\n",getpid());
}
}

//The line below, will be immediatly false for all the children
while ((ret= wait(&status))>0)
{
printf("After While My id is %d and my child with pid =%d exiting with return value=%d\n" ,
getpid(),ret, WEXITSTATUS(status));
}
//The if below will be true for the children only
if ((0 > ret) && (childid == 0)){
printf("Child with id %d exiting and my parent's id is %d\n", getpid(), getppid());
exit(i);
}
else{
printf("Parent Finally Exiting\n");
}
}

关于c - Ubuntu 中的 wait() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12551544/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com