以下程序应该执行此操作:
但是它只打印一个PID,然后除非我使用CTRL ^ C,否则它永远不会结束。我试图更改pause()功能的顺序但无济于事。这也是大学的家庭作业,他们说我们还不能使用信号灯。
如果您会西班牙语,请按照以下说明操作:
•proc gestor gestor的“ proproco padreGeneraráun proceso hijo”。
•El proceso gestorcrearáN_PROC procesos hijos(未参加比赛的人)en un 埃斯佩兰多tras crear cada proceso埃斯佩兰多市 enviándolelaseñalSIGUSR2。
•卡雷拉汽车参与者,无敌舰队,后备队 ”,请参见SIGUSR2。
•El proceso gestor,cuando haya creado los N_PROC procesos hijos和éstosesténlistos para la competición,要处理的事要在SIGUSR2上进行。
•El proceso padremandaráal grupo entero de procesos laseñal de lacompetición)。
•Cuando los参加者报名参加拉塞雷纳尔 y泰米尔纳兰人han capturado laseñal。
•诉讼程序反对者SIGUSR1,终止和终止。
•proceso padreesperaráa procedo gestor termine yacabaráéltambién。
谢谢。
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define N_PROC 4
void manejador_SIGUSR1(int sig) {
printf("Señal capturada\n");
exit(EXIT_SUCCESS);
}
void manejador_SIGUSR2(int sig) {
}
int main(void){
int i,pid[N_PROC+1];
struct sigaction act;
sigemptyset(&(act.sa_mask));
act.sa_flags = 0;
/* Se arma la señal SIGUSR1. */
act.sa_handler = manejador_SIGUSR1;
if (sigaction(SIGUSR1, &act, NULL) < 0) {
perror("sigaction");
exit(EXIT_FAILURE);
}
act.sa_handler = manejador_SIGUSR2;
if (sigaction(SIGUSR2, &act, NULL) < 0) {
perror("sigaction");
exit(EXIT_FAILURE);
}
if((pid[0] = fork()) == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if(pid[0] == 0) {
for(i=0;i<N_PROC;i++){
if((pid[i+1] = fork()) == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if(pid[i+1]==0){
printf("Proceso %d listo\n",getpid());
kill(SIGUSR2,getppid());
pause();
}
else{
pause();
}
}
kill(SIGUSR2,getppid());
pause();
while(wait(NULL)>0);
exit(EXIT_SUCCESS);
}
pause();
kill(SIGUSR1,0);
while(wait(NULL)>0);
exit(EXIT_SUCCESS);
}
答案 0 :(得分:0)
简短回答
您的kill
参数被交换,如注释中的@Arkku所示。您的“主进程”永远等待着它的第一个子代永远不会收到的SIGUSR2。
在旁边
哈!以种族语言(la carrera,leseñaldecompetición)给出的关于种族条件的作业。太好了。
如果我理解正确,那么所需的流程是这样的:
+--> [competitor]
+--> [competitor]
[starter] --> [manager] -+--> [competitor]
+--> [competitor]
这里有些事情可能出错。值得注意的是,@PSkocik的评论是正确的:you should use sigwait
or similar functions to avoid unintended races。另外,请不要use printf
in a signal handler。