我正在尝试使用SIGUSR1和sigqueue将孩子的pid发送给他的父亲。但是信号永远不会被发送,或者似乎没有被发送。
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <stdlib.h>
void handler(int signum, siginfo_t *info, void *extra)
{
void *ptr_val = info->si_value.sival_ptr;
int int_val = info->si_value.sival_int;
printf("Child: Father, I am %d!\n",int_val);
}
int main()
{
int pid;
printf("Father: I am %d\n",getpid());
if ( (pid=fork()) <0 )
{
perror("fork");
exit(EXIT_FAILURE);
}
else
if ( pid==0 )
{
printf("Child: I am My father is %d.\n",getppid());
sigqueue(getppid(),SIGUSR1,(const union sigval) getpid());
}
else
{
struct sigaction action;
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask,SIGUSR1);
action.sa_flags = SA_SIGINFO;
action.sa_mask =mask;
action.sa_sigaction = &handler;
if (sigaction(SIGUSR1,&action,NULL)==-1)
{
perror("sigaction");
exit(EXIT_FAILURE);
}
printf("Father: Welcome home, son!\n");
}
return 0;
}
运行上面的代码我得到以下输出:
Father: I am 18990
Father: Welcome home, son!
Child: My father is 18990.
并非全部。如果我再次运行它,我的所有应用程序关闭(编辑器,终端等),我需要再次登录。 (切换用户操作的种类)代码有什么问题?感谢。
答案 0 :(得分:2)
未捕获信号的原因是父级在孩子排队信号之前退出。只需在父级内部添加一个延迟,您就可以看到它捕获了信号。
通过我的系统为同一个程序输出的不同输出进一步加强了这个事实
Father: I am 18990
Father: Welcome home, son!
Child: My father is 1.
孩子注意到父亲的pid是1,因为父亲已经离开孩子作为孤儿并被初学者收养。
一个非常相关的问题