【发布时间】:2016-01-10 21:22:09
【问题描述】:
我正在根据指导方针为我的学习做项目,但我遇到了问题。我必须使用信号和管道进行通信,如下所示:
- 进程 2 接收信号并将其发送给父进程
- 父进程将信号值保存在管道中,并将信号发送到进程 1 以读取管道
- 进程 1 读取管道并向进程 2 发送信号以读取管道
- 进程 2 读取管道并向进程 3 发送信号以读取管道
- 进程 3 读取管道
不幸的是,当我向进程发送一个受支持的信号(例如 20)时,2 个信号被循环并且程序被 SIGUSR1 终止。
int stopm=0;
int stop1=0;
int stop2=0;
int stop3=0;
int termm=1;
int term1=1;
int term2=1;
int term3=1;
void obslugam(int sig){
signal(15,obslugam);
signal(18,obslugam);
signal(20,obslugam);
sigset_t mask_set;
sigfillset(&mask_set);
sigdelset(&mask_set,SIGUSR1);
sigdelset(&mask_set,SIGTERM);
sigdelset(&mask_set,SIGCONT);
sigdelset(&mask_set,SIGTSTP);
sigprocmask(SIG_BLOCK,&mask_set,NULL);
printf("Jestem M i odebralem sygnal %d\n",sig);
if(sig==15){
write(pm1[1],"15",2);
write(pm2[1],"15",2);
write(pm3[1],"15",2);
}
if(sig==18){
write(pm1[1],"18",2);
write(pm2[1],"18",2);
write(pm3[1],"18",2);
}
if(sig==20){
write(pm1[1],"20",2);
write(pm2[1],"20",2);
write(pm3[1],"20",2);
}
kill(PID1,10);
}
void obsluga1(int sig){
signal(10,obsluga1);
sigset_t mask_set;
sigfillset(&mask_set);
sigdelset(&mask_set,SIGUSR1);
sigprocmask(SIG_BLOCK,&mask_set,NULL);
printf("Jestem 1 i odebralem sygnal %d\n",sig);
char bufor_p1[2]={0};
if(read(pm1[0],&bufor_p1,2)==-1)perror("PIPE1\n");
if(strchr(bufor_p1,53)!=NULL) printf("Jestem 1 i dostałem 15\n");
else if(strchr(bufor_p1,56)!=NULL) printf("Jestem 1 i dostałem 18\n");
else if(strchr(bufor_p1,48)!=NULL) printf("Jestem 1 i dostałem 20\n");
kill(PID2,10);
}
void obsluga2(int sig){
signal(10,obsluga2);
signal(15,obsluga2);
signal(18,obsluga2);
signal(20,obsluga2);
sigset_t mask_set;
sigfillset(&mask_set);
sigdelset(&mask_set,SIGUSR1);
sigdelset(&mask_set,SIGTERM);
sigdelset(&mask_set,SIGCONT);
sigdelset(&mask_set,SIGTSTP);
sigprocmask(SIG_BLOCK,&mask_set,NULL);
printf("Jestem 2 i odebralem sygnal %d\n",sig);
if(sig==10){
char bufor_p2[2]={0};
if(read(pm2[0],&bufor_p2,2)==-1)perror("PIPE2\n");
if(strchr(bufor_p2,53)!=NULL) printf("Jestem 2 i dostałem 15\n");
else if(strchr(bufor_p2,56)!=NULL) printf("Jestem 2 i dostałem 18\n");
else if(strchr(bufor_p2,48)!=NULL) printf("Jestem 2 i dostałem 20\n");
kill(PID3,10);
}
else if(sig==15) kill(getppid(),15);
else if(sig==18) kill(getppid(),18);
else if(sig==20) kill(getppid(),20);
}
void obsluga3(int sig){
signal(10,obsluga3);
sigset_t mask_set;
sigfillset(&mask_set);
sigdelset(&mask_set,SIGUSR1);
sigprocmask(SIG_BLOCK,&mask_set,NULL);
printf("Jestem 3 i odebralem sygnal %d\n",sig);
char bufor_p3[2]={0};
if(read(pm3[0],&bufor_p3,2)==-1)perror("PIPE3\n");
if(strchr(bufor_p3,53)!=NULL) printf("Jestem 3 i dostałem 15\n");
else if(strchr(bufor_p3,56)!=NULL) printf("Jestem 3 i dostałem 18\n");
else if(strchr(bufor_p3,48)!=NULL) printf("Jestem 3 i dostałem 20\n");
}
int main(){
(...)
pipe(pm1);
pipe(pm2);
pipe(pm3);
signal(15,obslugam);
signal(18,obslugam);
signal(20,obslugam);
if((PID1=fork())==0) {
close(pm1[1]);
signal(10,obsluga1);
}
else if((PID2=fork())==0) {
close(pm2[1]);
signal(10,obsluga2);
signal(15,obsluga2);
signal(18,obsluga2);
signal(20,obsluga2);
}
else if((PID3=fork())==0){
printf("\nJestem procesem nr 2. Oto moj PID: %d\n\n",PID2);
close(pm3[1]);
signal(10,obsluga3);
}
else{
close(pm1[0]);
close(pm2[0]);
close(pm3[0]);
}
(...)
}
我尝试过,但找不到出错的地方。我会很感激你的帮助。
【问题讨论】:
-
请提供Minimal Complete and Verifiable Example。请不要
...代码。请提供确切的输出 - 目前尚不清楚“信号循环”等短语的确切含义。 -
您是否要混淆您的代码?为什么使用幻数而不是字符常量而不是信号的定义常量?