Я пытаюсь использовать сигналы и функцию pause () в c в моей домашней работе в колледже, но безрезультатно - PullRequest
0 голосов
/ 22 мая 2019

Следующая программа должна сделать это:

  1. Основной процесс должен создать дочерний процесс, который я для удобства теперь буду называть main child , затем дождаться сигнала SIGUSR2, затем отправить сигнал SIGUSR1 своему ребенку и внукам, потом жди своего ребенка и наконец закончи.
  2. Основной дочерний элемент должен выполнить 4 раза: создать дочерний элемент и ждать SIGUSR2. После этого процесс должен отправить SIGUSR2 его отцу, затем ждать SIGUSR1, затем ждать, пока его дети закончат и, наконец, закончат.
  3. Дети основного ребенка должны напечатать Proceso "PID" listo , затем отправить SIGUSR2 основному дочернему элементу, затем ждать SIGUSR1, затем вывести Señal capturada и, наконец, завершить.

Однако он просто печатает один PID, а затем никогда не завершается, если я не использую CTRL ^ C. Я пытался изменить порядок функций pause (), но безрезультатно. Также это домашняя работа для колледжа, и они сказали, что мы еще не можем использовать семафоры.

Если вы знаете испанский, вот инструкция:

• «Порядок действий» и «Порядок действий».

• В порядке действий, создаваемых N_PROC, он принимает участие в конкурсе (участвует в конкурсе) Bucle, Esperando Tras Crear Cada Proce Que Que Este Le Notifique Que Está Preparado enviándole la señal SIGUSR2.

• Участие в программе en la carrera, una vez activo y con la señal armada, imprimirá un mensaje y avisará al gestor mediante la señal SIGUSR2.

• Эль процедурный гестор, cuando haya creado los N_PROC обрабатывает фотографии и истории, связанные с этим конкуренция, авизарная процедура, в том числе и окончательная версия SIGUSR2.

• Процедура для детей и подростков de la Competición).

• Cuando los Participantes en la carrera reciban la señal я хан капурадо ла сеньаль, у терминар.

• Cuando el procso gestor reciba SIGUSR1, термин, обозначающий грех де хихос хиерфанос.

• Поступивший в свет и продолжая изучать термин и акабару и тамбиен.

Заранее спасибо.

#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 голосов
/ 22 мая 2019

Короткий ответ

Ваши аргументы для kill поменялись местами, как @ Arkku отмечено в комментариях.Ваш «главный процесс» всегда ждет SIGUSR2 от самого первого дочернего элемента, которого он никогда не получает.


В стороне

Ха!Задание об условиях гонки дано на языке гонок (la carrera, le señal de Competición).Это здорово.

Если я правильно понимаю, желаемый поток выглядит примерно так:

                         +--> [competitor]
                         +--> [competitor]
[starter] --> [manager] -+--> [competitor]
                         +--> [competitor]
  1. Starter создает manager
  2. Менеджер получает участников на стартовую линию
    1. Создать участника
    2. Ожидать участник , чтобы указать, что он готов (SIGUSR2)
    3. повторить для N_PROC участники всего
  3. менеджер говорит стартер , что участники готовы (SIGUSR2)
  4. Стартер запускает стартовый пистолет (SIGUSR1 до группа процессов )
  5. Участники раса!
  6. Менеджер Процесс завершается после пожинания всех участников .
  7. Стартер завершает работу после того, как пожнет manager .

Некоторые вещи могут пойти не так, как надо.Примечательно, что комментарий @ PSkocik прав: вам следует использовать sigwait или аналогичные функции, чтобы избежать непреднамеренных гонок .Также, пожалуйста, не используйте printf в обработчике сигналов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...