关于linux父进程、子进程和孙进程传递SIGCLD信号的问题

发布网友

我来回答

2个回答

热心网友

你应该贴上sig_cld的代码,在信号处理函数中输出可能是错误的根源,因为这些IO函数大多是不可重入的,或许没有将你希望见到的东西打出来,但是他们运行了。你应该找更保险的方法来验证信号处理函数运行了。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<sys/wait.h>
#include<errno.h>

static pid_t pid = 0;

static void sig_cld(int signo) {
while(!(pid=waitpid(-1, NULL, WNOHANG)));
}

int main (int argc, char* argv[]) {
pid_t local_pid = 0;
struct sigaction newact, oldact;
newact.sa_handler = sig_cld;
sigemptyset(&newact.sa_mask);
sigaddset(&newact.sa_mask, SIGCHLD);
newact.sa_flags = 0;
sigaction(SIGCHLD, &newact, &oldact);

if((local_pid = fork()) < 0) {
perror("Fork error!");
exit(1);
} else if (local_pid == 0) {
// child
fprintf(stderr,"child pid : %d\n", getpid());
sleep(2);
exit(0);
} else {
while(!pid)
sleep(1);
fprintf(stderr,"child ends : %d\n", pid);
}
exit(0);
}

#include<unistd.h>
#include<stdlib.h>
#include<errno.h>

int main(int argc, char* argv[]) {
if(execl("./main", "main", (char*)0) < 0) {
perror("execl error!");
exit(1);
}
exit(0);
}

以上代码运行完全如预料,没有问题。

热心网友

真想帮你,但不会!

热心网友

你应该贴上sig_cld的代码,在信号处理函数中输出可能是错误的根源,因为这些IO函数大多是不可重入的,或许没有将你希望见到的东西打出来,但是他们运行了。你应该找更保险的方法来验证信号处理函数运行了。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<sys/wait.h>
#include<errno.h>

static pid_t pid = 0;

static void sig_cld(int signo) {
while(!(pid=waitpid(-1, NULL, WNOHANG)));
}

int main (int argc, char* argv[]) {
pid_t local_pid = 0;
struct sigaction newact, oldact;
newact.sa_handler = sig_cld;
sigemptyset(&newact.sa_mask);
sigaddset(&newact.sa_mask, SIGCHLD);
newact.sa_flags = 0;
sigaction(SIGCHLD, &newact, &oldact);

if((local_pid = fork()) < 0) {
perror("Fork error!");
exit(1);
} else if (local_pid == 0) {
// child
fprintf(stderr,"child pid : %d\n", getpid());
sleep(2);
exit(0);
} else {
while(!pid)
sleep(1);
fprintf(stderr,"child ends : %d\n", pid);
}
exit(0);
}

#include<unistd.h>
#include<stdlib.h>
#include<errno.h>

int main(int argc, char* argv[]) {
if(execl("./main", "main", (char*)0) < 0) {
perror("execl error!");
exit(1);
}
exit(0);
}

以上代码运行完全如预料,没有问题。

热心网友

真想帮你,但不会!

热心网友

你应该贴上sig_cld的代码,在信号处理函数中输出可能是错误的根源,因为这些IO函数大多是不可重入的,或许没有将你希望见到的东西打出来,但是他们运行了。你应该找更保险的方法来验证信号处理函数运行了。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<sys/wait.h>
#include<errno.h>

static pid_t pid = 0;

static void sig_cld(int signo) {
while(!(pid=waitpid(-1, NULL, WNOHANG)));
}

int main (int argc, char* argv[]) {
pid_t local_pid = 0;
struct sigaction newact, oldact;
newact.sa_handler = sig_cld;
sigemptyset(&newact.sa_mask);
sigaddset(&newact.sa_mask, SIGCHLD);
newact.sa_flags = 0;
sigaction(SIGCHLD, &newact, &oldact);

if((local_pid = fork()) < 0) {
perror("Fork error!");
exit(1);
} else if (local_pid == 0) {
// child
fprintf(stderr,"child pid : %d\n", getpid());
sleep(2);
exit(0);
} else {
while(!pid)
sleep(1);
fprintf(stderr,"child ends : %d\n", pid);
}
exit(0);
}

#include<unistd.h>
#include<stdlib.h>
#include<errno.h>

int main(int argc, char* argv[]) {
if(execl("./main", "main", (char*)0) < 0) {
perror("execl error!");
exit(1);
}
exit(0);
}

以上代码运行完全如预料,没有问题。

热心网友

真想帮你,但不会!

热心网友

你应该贴上sig_cld的代码,在信号处理函数中输出可能是错误的根源,因为这些IO函数大多是不可重入的,或许没有将你希望见到的东西打出来,但是他们运行了。你应该找更保险的方法来验证信号处理函数运行了。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<sys/wait.h>
#include<errno.h>

static pid_t pid = 0;

static void sig_cld(int signo) {
while(!(pid=waitpid(-1, NULL, WNOHANG)));
}

int main (int argc, char* argv[]) {
pid_t local_pid = 0;
struct sigaction newact, oldact;
newact.sa_handler = sig_cld;
sigemptyset(&newact.sa_mask);
sigaddset(&newact.sa_mask, SIGCHLD);
newact.sa_flags = 0;
sigaction(SIGCHLD, &newact, &oldact);

if((local_pid = fork()) < 0) {
perror("Fork error!");
exit(1);
} else if (local_pid == 0) {
// child
fprintf(stderr,"child pid : %d\n", getpid());
sleep(2);
exit(0);
} else {
while(!pid)
sleep(1);
fprintf(stderr,"child ends : %d\n", pid);
}
exit(0);
}

#include<unistd.h>
#include<stdlib.h>
#include<errno.h>

int main(int argc, char* argv[]) {
if(execl("./main", "main", (char*)0) < 0) {
perror("execl error!");
exit(1);
}
exit(0);
}

以上代码运行完全如预料,没有问题。

热心网友

真想帮你,但不会!

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com