C:向儿童发送信号会导致无限循环

时间:2014-03-08 13:30:03

标签: c process signals fork posix

我的代码存在以下问题。当子进程收到SIGHUP(工作正常)时,它(子)应该从0开始计数,但是当父进程获得信号hup时,它应该让所有的子进程再次从0开始计数,但是当发送信号时,会发生类似无限循环的事情和on_hup函数为父母一直打电话并且不停止:(提前致谢。

#include <signal.h>
#include <stdio.h>
#include <wait.h>
#include <unistd.h>
#include <sys/types.h>
//#include "err.h"
#define NR_PROC 3

pid_t pid;
int a;
int pids[3];

void on_hup(int sig){    
    int i;
    if(pid!=0)           
        kill(0,SIGHUP);
    else    
        a=0;
}

void pierwsze(){
    for (;a<10000;a++){
        printf("%d: %d PID: %d \n",getpid(),a,pid);
    fflush(stdout);
    sleep(2);
} 

}

struct sigaction init(){
    struct sigaction sa;
    sigset_t block_mask;
    sigemptyset (&block_mask);
    sa.sa_mask = block_mask;
    sa.sa_flags=0;
    sa.sa_handler=on_hup;
    return sa;
}

int main(){
int i;
a=0;
struct sigaction setup_action = init();
sigaction(SIGHUP,&setup_action,0);

for(i=0;i<NR_PROC;i++){
    switch(pid = fork()){
      case -1:
        fprintf(stderr,"Error w fork \n");
      case 0:
        pids[i]=getpid();
        pierwsze();
        return 0;
      default:
        printf("I am parent My PID = %d\n",getpid());
        printf("fork = %d\n",pid);
    }
}
while(1){}
wait(0);
return 0;
}

1 个答案:

答案 0 :(得分:0)

无法在父级和子级之间共享数组pids

因此,您可以从父级的上下文中插入pid,而不是尝试将pid放入子级的上下文中:

代码如下:

case 0:
    pierwsze();
    return 0;
default:
    pids[i] = pid;
    printf("I am parent My PID = %d\n",getpid());
    printf("fork = %d\n",pid);