我正在创建几个子进程,这些子进程向其父进程发送信号并死亡。我只是数一数。但是我从来没有得到正确的计数。有些信号永远不会被处理程序捕获。
我应该如何编码?
#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
答案 0 :(得分:3)
这里的问题是信号充当硬件中断,而您的处理程序功能将是ISR(中断服务程序)。然后,如果多个具有相同值的信号“同时发生”,则Linux内核会将它们视为仅一个信号。信号并非设计为以这种方式使用。应该使用信号来告知另一个进程的状态。为了实现进程之间的通信,您应该使用IPC(进程间通信)机制,例如队列,套接字或管道。
答案 1 :(得分:1)
谢谢
我发现可以使用实时信号解决问题。只需使用SIGRTMIN更改SIGUSR1。实时信号排队(http://man7.org/linux/man-pages/man7/signal.7.html)。
此解决方案是否有负面影响?
答案 2 :(得分:-1)
正在工作。.
#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;
}