gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:17:27 24 4
gpt4 key购买 nike

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

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

然而,它只打印一个 PID,然后除非我使用 CTRL^C,否则它永远不会结束。我尝试更改pause() 函数的顺序,但无济于事。这也是大学的家庭作业,他们说我们还不能使用信号量。

如果您懂西类牙语,以下是说明:

• El proceso padre genericará un proceso hijo, que será el proceso gestor.

• El proceso gestor creará N_PROC procesos hijos (los attendees en la competición) en unBucle, esperando tras crear cada process a que est le notifique que está preparadoSIGUSR2 环境。

• 卡雷拉卡达参与者,我们积极行动并与塞尼亚尔舰队合作,imprimirá un mensajey avisará al gestor midte la señal SIGUSR2 。

• El proceso gestor, cuando haya creado los N_PROC procesos hijos éstos estén listos para la竞赛,请参阅 SIGUSR2 任务列表。

• El proceso padre mandará al grupo Entero de procesos la señalde la competición)。

• 参加者在卡雷拉雷西类拉塞尼亚尔ya han capturado la señal, y terminarán.

• 执行 SIGUSR1 操作,终止执行操作。

• El proceso padre esperará a que el proceso gestor termine y acabará él tambié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);
}

最佳答案

简答

你的kill参数被交换,如@Arkku评论中指出。您的“主进程”永远等待来自其第一个子进程的 SIGUSR2,但它从未收到过。

<小时/>

旁白

哈!以种族语言给出的有关种族条件的作业(la carrera, le señal de competición)。太好了。

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

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

这里可能会出现一些问题。值得注意的是,@PSkocik评论是对的:you should use sigwait or similar functions to avoid unintended races 。另外,请不要use printf in a signal handler

关于c - 我尝试在大学作业中使用 c 中的信号和暂停()函数,但无济于事,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56260431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com