我在大学作业中尝试在c中使用信号和pause()函数,但无济于事

时间:2019-05-22 15:36:10

标签: c signals

以下程序应该执行此操作:

  1. 主进程应该创建一个子进程,为了方便起见,从现在起我将其称为主要子进程,然后等待SIGUSR2信号,然后将SIGUSR1信号发送给他的子孙,然后等待他的孩子,最后结束。
  2. 主要子项应执行以下4次操作:创建一个子项并等待SIGUSR2。之后,该过程应将SIGUSR2发送给他的父亲,然后等待SIGUSR1,然后等待他的孩子结束并最终结束。
  3. 主要孩子的孩子应打印 Proceso“ PID” listo ,然后将SIGUSR2发送给主要孩子,然后等待SIGUSR1,然后打印Señalcapturada ,最后结束。

但是它只打印一个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);
}

1 个答案:

答案 0 :(得分:0)

简短回答

您的kill参数被交换,如注释中的@Arkku所示。您的“主进程”永远等待着它的第一个子代永远不会收到的SIGUSR2。


在旁边

哈!以种族语言(la carrera,leseñaldecompetición)给出的关于种族条件的作业。太好了。

如果我理解正确,那么所需的流程是这样的:

                         +--> [competitor]
                         +--> [competitor]
[starter] --> [manager] -+--> [competitor]
                         +--> [competitor]
  1. 启动器创建管理器
  2. 经理竞争对手带到起跑线
    1. 创建一个竞争对手
    2. 等待竞争对手表明它已准备好(SIGUSR2)
    3. 重复N_PROC个竞争对手
  3. 管理器告诉启动器 竞争对手已经准备好(SIGUSR2)
  4. 启动器触发starting pistol(SIGUSR1到进程组
  5. 竞争对手比赛!
  6. Manager 进程在获得所有竞争对手后终止。
  7. 启动器在收获经理后终止。

这里有些事情可能出错。值得注意的是,@PSkocik的评论是正确的:you should use sigwait or similar functions to avoid unintended races。另外,请不要use printf in a signal handler