【发布时间】:2015-03-09 10:57:40
【问题描述】:
在接收到 SIGUSR1 信号时,我想显示孩子从管道中读取的值。
有一个小问题。尽管 getppid() 已由父进程写入管道,但它始终显示 0。有什么解决办法吗? `
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
char bufP[10], bufC[10];
int gpid;
void handler(int signum){
signal(SIGUSR1, handler);
if (signum == SIGUSR1){
printf("SIGUSR1 received\n");
gpid = atoi(bufC);
printf("Grandparent: %d\n", gpid);
exit(0);
}
}
int main(void){
int pid, fd[2];
pipe(fd);
pid = fork();
signal(SIGUSR1, handler);
if (pid == 0){
//child
close(fd[1]);
read(fd[0], bufC, sizeof(bufC));
close(fd[0]);
}else{
//parent
close(fd[0]);
sprintf(bufP, "%d", getppid());
write(fd[1], bufP, sizeof(bufP));
kill(pid, SIGUSR1);
close(fd[1]);
}
}
`
感谢您的回复。
【问题讨论】:
-
永远不要在信号处理程序中使用
printf。不是async signal safe