【发布时间】:2014-07-19 13:38:26
【问题描述】:
我正在尝试使用 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.
这还不是全部。如果我再次运行它,我的所有应用程序都会关闭(编辑器、终端等),我需要再次登录。 (一种切换用户操作)代码有什么问题?谢谢。
【问题讨论】:
标签: c signals ipc pid sigqueue