簡體   English   中英

Waitpid就像在非阻塞模式下一樣

[英]Waitpid acting as if in non-blocking mode

我正在玩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); 

}

根據我的理解,我將child的pgid設置為其自己的pid。 當我使用-a作為參數調用waitpid時,我基本上是在等待pgid = a中的任何進程完成之前進行等待(阻塞)。 但是,程序的輸出不是我期望的! 子進程根本沒有收獲。 好像waitpid處於非阻塞模式。 輸出:

Parent pid = 11372
Child pid = 11373
11373

(輸出是瞬時的,它不會等待10秒!)

編輯:我在execvp printf("Here")添加了printf("Here")exit(1) ,並按照注釋中的建議打印出了waitpid的輸出。 這里不打印,waitpid打印-1

問題是比賽條件。 后叉在這里:

a = fork();

如果子級先運行,則在此處創建進程組-a

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

然后父母在這里等待:

waitpid(-a,&t2,0);

但是,如果父級先運行,則進程組-a 尚不存在,並且waitpid()失敗並顯示ECHILD 第二種情況顯然發生在您的系統上。

您將必須找到某種方法來確保子級中的setpgid()調用在父級中的waitpid()調用之前運行。 復雜的方法是信號量,簡單的(hacky)方法是短暫的延遲,在waitpid()可能就足夠之前使用usleep(1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM