准确处理进入父进程的所有类型 SIGUSR1 信号



我想写一个程序,使用 fork() 函数创建 N 个子级。每个孩子将等待 0 到 3 秒,然后它会向它的父级发送一个信号SIGUSR1。父级处理所有这些信号。

问题是我的程序并不总是处理来自其子级的所有信号。怎么修?

第二个问题:我知道我不应该在处理程序中使用 printf,因为可能会发生不好的事情。如何替换此指令?

主.c

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void error(char *s){
printf("%sn",s);
perror("Program execution failed.");
exit(EXIT_FAILURE);
}
volatile int N=8; //final number of children
volatile int k=0; //number of received SIGUSR1 signals
void childRequestHandler(int signo, siginfo_t* info, void* context){
k++;
printf("%d,Father received request from child: %dn",k,info->si_pid);
}
int main() {
struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = childRequestHandler;
if(sigaction(SIGUSR1,&act,NULL) == -1) printf("ERROR OCCURED");
for(int i=0;i<N;i++){
pid_t pid = fork();
if(pid == 0) {
execl("./child", "./child", NULL);
error("Fork error happenedn");
}
}
while (1){
sleep(1);
}
}

儿童.c

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <time.h>

int main() {
time_t t;
srand((unsigned int) getpid()+ time(NULL));

int length_of_sleeping = rand() % 4 ;
printf("I live: %d, sleeps %ds n",getpid(),length_of_sleeping);
sleep(length_of_sleeping);
kill(getppid(),SIGUSR1);
while(1){
}
}

输出:

I live: 4195, sleeps 3s 
I live: 4196, sleeps 3s 
I live: 4197, sleeps 1s 
I live: 4202, sleeps 3s 
I live: 4198, sleeps 0s 
I live: 4201, sleeps 2s 
I live: 4199, sleeps 0s 
I live: 4200, sleeps 3s 
1,Father received request from child: 4198
2,Father received request from child: 4197
3,Father received request from child: 4201
4,Father received request from child: 4195

当信号处理程序正在执行时,信号被阻止。在此期间收到的所有SIGUSR1信号都不会被注意到。

您可以在建立信号时使用SA_NODEFER标志,有关标志的信息,请参阅sigaction手册页。

但是,如果您使用SA_NODEFER,请不要使用printf!它不是一个异步信号安全函数。例如,请参阅有关信号安全的手册页以获取更多信息。


来自 POSIXsigaction参考:

当信号被sigaction()安装的信号捕获功能捕获时,计算并在信号捕获功能期间安装新的信号模板。该掩码是通过当前信号掩码和被传递信号的sa_mask值并集而形成的,除非设置了SA_NODEFERSA_RESETHAND,否则包括正在传递的信号。如果用户的信号处理程序正常返回,则恢复原始信号掩码。

[强调我的]

相关内容

  • 没有找到相关文章

最新更新