以下是我的代码。父进程分叉一个子进程。子进程暂停,直到父进程向它发送信号,然后它继续运行。
我的问题是为什么子进程不继续
追随父母向他发送信号。我错过或误解了什么吗?
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
void
sigusr1( int pidno )
{
printf("Catched\n");
}
int
main()
{
pid_t pid;
signal( SIGUSR1, sigusr1 );
if( (pid = fork()) == 0 ){
pause();
printf("Child\n");
}
kill( pid , SIGUSR1 ); //parent sends signal to child
pause();
}
这是父级中发生的情况:
- 叉一个孩子。
- 向子进程发送 SIGUSR1。
- 等待信号。
这是孩子身上发生的情况:
- 等待信号。
- Print
Child
.
- Call
kill(0, SIGUSR1)
(0 的值是pid
在孩子身上)。呼唤kill
进程 ID 为 0 的进程向每个进程发送信号进程组 http://en.wikipedia.org/wiki/Process_group调用的进程的kill
.
- 等待信号。
您的程序有多种可能的行为,具体取决于父系统调用和子系统调用的执行顺序。根据操作系统的确切版本、各种内核参数的微调、系统的负载情况以及随机的机会,如果多次运行该程序或在一个特定的环境下运行该程序,您可能会或可能不会观察到不同的行为。调试器。
如果父级启动速度比子级快,您可能会看到以下内容:
- 父级向子级发送 SIGUSR1。
- 子进程收到 SIGUSR1 并打印
Catched
.
- 孩子打电话
pause
.
- 家长来电
pause
.
按照这个执行顺序,父进程和子进程最终都会永远等待(这是一个deadlock http://en.wikipedia.org/wiki/Deadlock).
如果子进程启动得比父进程快,您可能会看到以下情况:
- 孩子打电话
pause
.
- 父级向子级发送 SIGUSR1。
- 家长来电
pause
.
- 孩子已解锁并打印
Catched
.
- 儿童版画
Child
.
- 子进程向进程组发送 SIGUSR1。
- 儿童版画
Catched
.
- 孩子打电话
pause
.
- 父级已解锁并打印
Catched
.
- 家长退出。
我不认为孩子有办法退出:它调用pause
两次,虽然它最多可以接收两个信号,但其中一个是从其自身发送的(来自kill(0,SIGUSR1)
)并且该值是同步传递的,而不是在执行期间传递pause
.
这个程序可能不是您想要编写的,但是由于您没有描述预期的行为,因此不可能说出您想要编写的内容。我确实注意到,您没有遵循分叉程序的通常结构:
pid = fork();
if (pid < 0) {
/*error handling*/
} else if (pid == 0) {
/*child code*/
exit(...); /*Usually, what follows the if is specific to the parent.*/
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)