编写我自己的玩具外壳,并在尝试实现作业控制时遇到了障碍。
我正在使用 setpgid 在子进程和父进程中设置子进程组。我的等待电话是:
pid = waitpid(-pid, &status, 0)
然而,waitpid 返回 -1 并且 perror 说“没有子进程”。然而,似乎每次都在等待。另外,当从 shell 运行时, ps 输出看起来是正确的。因为 psparent 的进程是 kbsh 就像我所期望的那样。
% ps -o pid,ppid,pgrp,session,tpgid,comm
Forking
In Parent: Setting process group to 20809 of process 20809 with setpgid
In Child Processes, pid of child process is 20809
in Child: Setting process group to 20809 of process 20809 with setpgid
Requesting that Process Group 20809 becomes the foreground process with tcsetpgrp
Waiting for job with process group 20809
PID PPID PGRP SESS TPGID COMMAND
12002 32573 12002 12002 20809 zsh
20808 12002 20808 12002 20809 kbsh
20809 20808 20809 12002 20809 ps
Wait Error: No child processes
Restoring Shell process group 20808 to forground
有人看到我做错了什么吗?如果需要的话可以发布更多代码...
我忽略了 waitpid 手册页中的 sigchld:
POSIX.1-2001 指定如果
处置SIGCHLD 设置为
SIG_IGN 或 SA_NOCLDWAIT 标志是
设置为 SIGCHLD(参见 sigaction(2)),
那么终止的孩子不会
成为僵尸并调用 wait() 或
waitpid() 将阻塞,直到所有
孩子们已经终止,然后
失败,errno 设置为 ECHILD。(这
原来的 POSIX 标准留下了
将 SIGCHLD 设置为的行为
SIG_IGN 未指定。)Linux 2.6
符合本规范。
然而,Linux 2.4(及更早版本)确实
不是:如果 wait() 或 waitpid() 调用是
当 SIGCHLD 被忽略时,
调用的行为就像
SIGCHLD 没有被忽略,
也就是说,该调用会阻塞,直到下一个
孩子终止然后返回
该子进程的进程 ID 和状态。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)