waitpid函数充当如果非阻塞模式

问题描述 投票:1回答:1

我玩弄系统在C调用和我坚持想了解这个节目,我做 -

int main(int argc, char* argv[])
{
int a;
char *args[]={"sleep"," 10",NULL}; 

a = fork();
int stat;


if(a==0){
    setpgid(getpid(),getpid());
    printf("%d\n",getpgid(getpid()));
    execvp(args[0],args);}
else
{
    int t2;
    waitpid(-a,&t2,0);
}

printf("Parent pid = %d\n", getpid()); 
printf("Child pid = %d\n", a); 

}

按照我的理解,我已经设置孩子的PGID作为自己的PID。当我打电话waitpid与-a作为参数,我基本上是要求它等待(阻塞),直到在PGID =是否结束的任何进程。但是,该程序的输出是不是我的预期!子进程完全不被收割。这是因为如果waitpid函数是在非阻塞模式。输出:

Parent pid = 11372
Child pid = 11373
11373

(输出是瞬时的,它不会等待10秒!)

编辑:我添加了下面execvp printf("Here")exit(1)并打印出来,waitpid函数的输出作为意见提出。这里没有得到印刷和waitpid函数打印-1

c operating-system system-calls pid waitpid
1个回答
2
投票

这个问题是一个竞争状态。这里的叉后:

a = fork();

如果孩子跑第一在这里创建的进程组-a

if(a==0){
    setpgid(getpid(),getpid());

和父然后等待在这里:

waitpid(-a,&t2,0);

但如果父母得到先运行,进程组-a尚不存在与waitpid()失败ECHILD。第二种情况显然发生在您的系统。

你必须找到某种方式来确保,在孩子说thesetpgid()调用父的waitpid()调用之前运行。复杂的方法是信号量,容易(哈克)方法是在短暂的延迟,usleep(1)waitpid()之前可能就足够了。

© www.soinside.com 2019 - 2024. All rights reserved.