Следующая программа должна сделать это:
- Основной процесс должен создать дочерний процесс, который я для удобства теперь буду называть main child , затем дождаться сигнала SIGUSR2, затем отправить сигнал SIGUSR1 своему ребенку и внукам, потом жди своего ребенка и наконец закончи.
- Основной дочерний элемент должен выполнить 4 раза: создать дочерний элемент и ждать SIGUSR2. После этого процесс должен отправить SIGUSR2 его отцу, затем ждать SIGUSR1, затем ждать, пока его дети закончат и, наконец, закончат.
- Дети основного ребенка должны напечатать 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);
}