- 论坛徽章:
- 0
|
写了一个父子进程通过信号通信的代码,可是一运行程序,子进程就成了僵尸进程,为何?
代码如下:
#include<stdio.h>
#include<signal.h>
void sig_func(int signo, siginfo_t s_info, void *p_info) {
char *ptr = NULL;
ptr = s_info.si_value.sival_ptr;
printf("capature signo:%d, msg:%s\n", signo, ptr);
}
int main(int argc,char *argv[]){
pid_t pid = 0;
pid_t ppid = 0;
char *ptr = "Hello,signal";
struct sigaction sa;
union sigval s_val;
ppid = getpid();
printf("parent pid = %d\n", ppid);
pid = fork();
if (pid < 0) {
printf("fork error\n");
} else if (pid == 0) {
printf("This is child process\n");
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = sig_func;
sigaddset(&sa.sa_mask, SIGQUIT);
sigprocmask(SIG_BLOCK, &sa.sa_mask, NULL);
sigaction(SIGINT, &sa, NULL);
sigaction(SIGUSR1, &sa, NULL);
sigaction(SIGQUIT, &sa, NULL);
} else {
printf("child pid = %d\n", pid);
printf("This is parent process\n");
s_val.sival_ptr = ptr;
//sigqueue(pid, SIGCONT, s_val);
//kill(pid, SIGSTOP);
sigqueue(pid, SIGUSR1, s_val);
}
while(1);
return 0;
}
gcc fork.c -o fork
./fork &
[1] 3986
parent pid = 3986
child pid = 3987
This is parent process
ps -ef | grep fork
message+ 662 1 0 17:23 ? 00:00:02 dbus-daemon --system --fork
bruceji+ 1951 1878 0 18:41 ? 00:00:01 dbus-daemon --fork --session --address=unix:abstract=/tmp/dbus-IhuIaA1yWk
bruceji+ 2007 2001 0 18:41 ? 00:00:00 /bin/dbus-daemon --config-file=/etc/at-spi2/accessibility.conf --nofork --print-address 3
bruceji+ 2061 1878 0 18:41 ? 00:00:00 //bin/dbus-daemon --fork --print-pid 7 --print-address 9 --config-file /usr/share/fcitx/dbus/daemon.conf
bruceji+ 3732 2498 0 19:49 pts/8 00:00:00 vi fork.c
bruceji+ 3986 3757 99 19:53 pts/0 00:00:14 ./fork
bruceji+ 3987 3986 0 19:53 pts/0 00:00:00 [fork] <defunct>
bruceji+ 3997 3757 0 19:53 pts/0 00:00:00 grep --color=auto fork
|
|