我正在创建几个子进程,这些子进程向其父进程发送信号并终止。我只是简单地数一数。但我从来没数对过。有些信号永远不会被处理程序捕获。
我该如何编码呢?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int ended = 0;
void handler(int sig){
ended++;
}
int main(int argc, char **argv){
int i;
pid_t pid, ppid;
if (signal(SIGUSR1, handler) < 0) {
fprintf(stderr, "signal failed.\n");
exit (-1);
}
ppid = getpid();
for (i = 0; i < 50; i++){
if ((pid = fork()) < 0){
fprintf(stderr, "fork failed.\n");
exit(-1);
}
if (pid == 0){
kill(ppid, SIGUSR1);
exit(0);
}
}
while (wait(NULL) > 0);
printf("ended = %d\n", ended);
return 0;
} 这个程序的输出有时是47,其他的是39...但决不是50
发布于 2019-04-10 17:19:17
这里的问题是,信号充当硬件中断,而您的处理程序函数将是ISR (中断服务例程)。然后,如果多个相同值的信号“同时”发生,linux内核只将它们视为一个信号。信号不被设计成以这种方式使用。应该使用信号将一个进程的状态通知给另一个进程。为了实现进程之间的通信,您应该使用IPC (InterProcess通信)机制,如队列、套接字或管道。
发布于 2019-04-12 15:01:05
谢谢,
我发现这个问题可以用实时信号来解决。只需使用SIGRTMIN更改SIGUSR1。实时信号排队(http://man7.org/linux/man-pages/man7/signal.7.html)。
这个解决方案有什么负面影响吗?
发布于 2019-04-10 18:09:35
它起作用了..
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int ended = 0;
void handler(int sig)
{
ended++;
}
int main(int argc, char **argv)
{
int i;
pid_t pid, ppid;
if (signal(SIGUSR1, handler) < 0)
{
fprintf(stderr, "signal failed.\n");
exit (-1);
}
ppid = getpid();
for (i = 0; i < 50; i++)
{
if ((pid = fork()) < 0)
{
fprintf(stderr, "fork failed.\n");
exit(-1);
}
if (pid == 0)
{
kill(ppid, SIGUSR1);
exit(0);
}
}
while (wait(NULL) > 0);
printf("ended = %d\n", ended);
return 0;
}https://stackoverflow.com/questions/55608559
复制相似问题