应该处于睡眠状态的活动进程
Active process when it should be in sleep
谁能根据下一行代码中 waitpid() 的输出向我解释为什么子进程处于活动状态?我一直卡在这个问题上。
int main(){
int p;
if (!(p = fork())){sleep(10);
return;}
int s;
sleep(1);
printf("%d \n", waitpid(p,&s, WNOHANG|WUNTRACED));
kill(p,2);
return 0;
}
提前致谢!
评论变成了带有扩展信息的答案。
最初的旁白
您的 return;
语句应该是 return 0;
并且您的编译器应该抱怨 return 在 return 的函数中没有值值。
为什么要写扭曲的C? if ((p = fork()) == 0)
作为条件有什么问题? (不是每个人都会同意我的看法,但你可以从我这里得到我的评论,如果其他人愿意的话,他们可以发表不同的评论。)
你应该错误检查你的系统调用,并打印显着信息(如 PID,如果 waitpid()
报告 waitpid()
之后 s
中的值成功,并检查 kill()
。请注意,waitpid()
returning 除了 child 是否已死(它不会死)之外,并没有告诉你太多信息. 休眠(没有死,程序可能会再次醒来——除非它先被杀死)和死(没有机会再次醒来)是有区别的。waitpid()
函数只报告死 children (或 untraced/stopped children — 这里不是问题),而不是 children 还活着,即使他们只是睡着了,等待信号。
你的问题
'the child process is active'是什么意思?它会休眠 10 秒。您的父母代码休眠 1 秒,立即执行 waitpid()
,returns,通常报告没有死 children(因为 child 尚未完成休眠yet),然后你打断了child(为什么2
没有写成SIGINT
?)。
你在看什么;你在期待什么?
waitpid()
returns 0 and I was expecting from it to return the PID of child process. This is what I don't understand. If child process is suspended, why does waitpid() return 0 instead of the PID of child?
POSIX waitpid()
规范说:
Return value
If wait()
or waitpid()
returns because the status of a child process is available, these functions shall return a value equal to the process ID of the child process for which status is reported. If wait()
or waitpid()
returns due to the delivery of a signal to the calling process, -1 shall be returned and errno
set to [EINTR]. If waitpid()
was invoked with WNOHANG set in options
, it has at least one child process specified by pid
for which status is not available, and status is not available for any process specified by pid
, 0 is returned. Otherwise, -1 shall be returned, and errno
set to indicate the error.
已强调
您所看到的完全符合规格。 child 还没有死,所以你不能得到一个状态,但是因为你使用了 WNOHANG
,你得到 0 和一个立即的 return,而不是等到 [=78] =] 退出。
谁能根据下一行代码中 waitpid() 的输出向我解释为什么子进程处于活动状态?我一直卡在这个问题上。
int main(){
int p;
if (!(p = fork())){sleep(10);
return;}
int s;
sleep(1);
printf("%d \n", waitpid(p,&s, WNOHANG|WUNTRACED));
kill(p,2);
return 0;
}
提前致谢!
评论变成了带有扩展信息的答案。
最初的旁白
您的
return;
语句应该是return 0;
并且您的编译器应该抱怨 return 在 return 的函数中没有值值。为什么要写扭曲的C?
if ((p = fork()) == 0)
作为条件有什么问题? (不是每个人都会同意我的看法,但你可以从我这里得到我的评论,如果其他人愿意的话,他们可以发表不同的评论。)你应该错误检查你的系统调用,并打印显着信息(如 PID,如果
waitpid()
报告waitpid()
之后s
中的值成功,并检查kill()
。请注意,waitpid()
returning 除了 child 是否已死(它不会死)之外,并没有告诉你太多信息. 休眠(没有死,程序可能会再次醒来——除非它先被杀死)和死(没有机会再次醒来)是有区别的。waitpid()
函数只报告死 children (或 untraced/stopped children — 这里不是问题),而不是 children 还活着,即使他们只是睡着了,等待信号。
你的问题
'the child process is active'是什么意思?它会休眠 10 秒。您的父母代码休眠 1 秒,立即执行 waitpid()
,returns,通常报告没有死 children(因为 child 尚未完成休眠yet),然后你打断了child(为什么2
没有写成SIGINT
?)。
你在看什么;你在期待什么?
waitpid()
returns 0 and I was expecting from it to return the PID of child process. This is what I don't understand. If child process is suspended, why does waitpid() return 0 instead of the PID of child?
POSIX waitpid()
规范说:
Return value
If
wait()
orwaitpid()
returns because the status of a child process is available, these functions shall return a value equal to the process ID of the child process for which status is reported. Ifwait()
orwaitpid()
returns due to the delivery of a signal to the calling process, -1 shall be returned anderrno
set to [EINTR]. Ifwaitpid()
was invoked with WNOHANG set inoptions
, it has at least one child process specified bypid
for which status is not available, and status is not available for any process specified bypid
, 0 is returned. Otherwise, -1 shall be returned, anderrno
set to indicate the error.
已强调
您所看到的完全符合规格。 child 还没有死,所以你不能得到一个状态,但是因为你使用了 WNOHANG
,你得到 0 和一个立即的 return,而不是等到 [=78] =] 退出。