以下是我的代码。父母要求孩子。子项暂停直到父发送信号给它,然后它继续运行。 我的问题是为什么儿童过程不继续 在父母向他发送信号后运行。我错过了什么或误解了什么吗?
#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();
}
答案 0 :(得分:3)
以下是父母所发生的事情:
以下是孩子的情况:
Child
。kill(0, SIGUSR1)
(0是孩子中pid
的值)。调用进程ID为0的kill
会将信号发送到调用kill
的进程的process group中的每个进程。您的程序有几种可能的行为,具体取决于执行父系统调用和子系统调用的顺序。根据操作系统的确切版本,微调各种内核参数,系统加载方式以及随机机会,如果您多次运行程序或在运行程序下,您可能会或可能不会观察到不同的行为调试器。
如果父母的开始时间比孩子快,您可能会看到:
Catched
。pause
。pause
。有了这个执行顺序,父母和孩子都会永远等待(这是deadlock)。
如果孩子比父母开始得快,你可能会看到:
pause
。pause
。Catched
。Child
。Catched
。pause
。Catched
。我认为孩子没有办法退出:它会调用pause
两次,虽然它最多可以接收两个信号,但其中一个是自己发送的({{1并且那个是同步传递的,而不是在执行kill(0,SIGUSR1)
期间传递的。
这个程序可能不是你想要编写的,但由于你没有描述预期的行为,所以不可能分辨你写的意思。我注意到你没有遵循分叉程序的通常结构:
pause
答案 1 :(得分:1)
试试这个:
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
void
sigusr1( int pidno )
{
fprintf(stderr, "Caught\n");
}
int
main()
{
pid_t pid;
signal( SIGINT, sigusr1 );
if( (pid = fork()) == 0 ){
pause();
fprintf(stderr, "Child\n");
}
else
{
fprintf(stderr, "Parent\n");
kill( pid , SIGINT ); //parent sends signal to child
}
pause();
return 0;
}
printf
缓冲区输入:可能正在调用它,但是在您预期时它不会显示。一种解决方法是fflush()
。一个更好的解决方法是fprintf (stderr)
,它首先不缓冲。
您正在父母和孩子中调用kill()
。我添加了else
来消除此问题。
以下是示例输出:
gcc -Wall -g -o z z.c
./z
Parent
Caught
Child