我的代码存在以下问题。当子进程收到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;
}
答案 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);