如果发送太快则忽略信号
Ignoring signal if it's sent too quickly
我有以下代码:
//includes...
#define SIG_INT 0
//prints out <Text> when SIG_INT is received from siginfo_t*
void handler(int, siginfo_t*, void*);
int main()
{
pid_t ambulance1 = 0;
pid_t ambulance2 = 0;
struct sigaction sigact;
sigact.sa_sigaction = handler;
sigemptyset(&sigact.sa_mask);
sigact.sa_flags = SA_SIGINFO;
sigaction(SIGUSR1, &sigact, NULL);
ambulance1 = fork();
if(ambulance1 > 0) {
ambulance2 = fork();
if(ambulance2 > 0) { // parent
int status;
waitpid(ambulance1, &status, 0);
waitpid(ambulance2, &status, 0);
printf("HQ went home!\n");
}
}
if(ambulance1 == 0 || ambulance2 == 0) {
union sigval signalValueInt;
signalValueInt.sival_int = SIG_INT;
sigqueue(getppid(), SIGUSR1, signalValueInt);
printf("Ambulance[%d] ended.\n", getpid());
}
return 0;
}
发生的情况是:有时第二辆救护车的 sigqueue(getppid(), SIGUSR1, signalValueInt);未收到,输出类似于以下内容:
- 救护车[20050]结束。 // main() 打印出这个
- 救护车[20051]结束。 // main() 打印出这个
- // handler() 用 write() 打印出来 ONLY ONCE!
- 总部回家了! // main() 打印出这个
我知道信号丢失了,因为两个信号接连到达太快,并且操作系统。认为这是错误重复,因此被忽略。
我的问题是:
有没有办法告诉操作系统不要那样做?
我不想为同一目的使用两个不同的信号(例如:SIGUSR1 和 SIGUSR2),我也不喜欢在其中一个子进程中使用延迟。
答案在signal(7) 的手册页中。
但简而言之:
如果在处理程序 运行 时标准信号到达(如 SIGUSR1),它将被操作系统忽略。
如果在处理程序 运行 时实时信号到达(如 SIGRTMIN),它将在处理程序完成后处理 运行.
我有以下代码:
//includes...
#define SIG_INT 0
//prints out <Text> when SIG_INT is received from siginfo_t*
void handler(int, siginfo_t*, void*);
int main()
{
pid_t ambulance1 = 0;
pid_t ambulance2 = 0;
struct sigaction sigact;
sigact.sa_sigaction = handler;
sigemptyset(&sigact.sa_mask);
sigact.sa_flags = SA_SIGINFO;
sigaction(SIGUSR1, &sigact, NULL);
ambulance1 = fork();
if(ambulance1 > 0) {
ambulance2 = fork();
if(ambulance2 > 0) { // parent
int status;
waitpid(ambulance1, &status, 0);
waitpid(ambulance2, &status, 0);
printf("HQ went home!\n");
}
}
if(ambulance1 == 0 || ambulance2 == 0) {
union sigval signalValueInt;
signalValueInt.sival_int = SIG_INT;
sigqueue(getppid(), SIGUSR1, signalValueInt);
printf("Ambulance[%d] ended.\n", getpid());
}
return 0;
}
发生的情况是:有时第二辆救护车的 sigqueue(getppid(), SIGUSR1, signalValueInt);未收到,输出类似于以下内容:
- 救护车[20050]结束。 // main() 打印出这个
- 救护车[20051]结束。 // main() 打印出这个
- // handler() 用 write() 打印出来 ONLY ONCE!
- 总部回家了! // main() 打印出这个
我知道信号丢失了,因为两个信号接连到达太快,并且操作系统。认为这是错误重复,因此被忽略。
我的问题是:
有没有办法告诉操作系统不要那样做?
我不想为同一目的使用两个不同的信号(例如:SIGUSR1 和 SIGUSR2),我也不喜欢在其中一个子进程中使用延迟。
答案在signal(7) 的手册页中。 但简而言之: 如果在处理程序 运行 时标准信号到达(如 SIGUSR1),它将被操作系统忽略。 如果在处理程序 运行 时实时信号到达(如 SIGRTMIN),它将在处理程序完成后处理 运行.