【发布时间】:2019-11-25 18:33:35
【问题描述】:
我正在学习 C,我一直在尝试制作一个简单的测试程序。问题是我有一个通过我不理解的方式解决的问题。这是我的程序:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>
void trat1(int s){
signal(SIGALRM, trat1);
}
void trat2(int s){
signal(SIGALRM, trat2);
}
int main( void ) {
int statusHijo1, statusHijo2;
int hijo1, hijo2;
int hijoFinalizado, status;
statusHijo1 =0;
statusHijo2 = 0;
if((hijo1 = fork()) == 0){
/* Hijo 1 */
printf("-- Hijo1 PID:%d | Parent PID:%d", getpid(), getppid());
printf("\n -- Hijo1 Lanzando SIGTERM -- \n");
while(1){
signal(SIGALRM, trat2);
alarm(1);
pause();
printf(" -- Hijo1 awaitting 1 sec.. \n");
}
}
else{
if ( (hijo2=fork()) == 0 ) {
/* Hijo 2 */
printf("++ Hijo2 PID:%d | Parent PID:%d \n", getpid(), getppid());
signal(SIGALRM, trat2);
alarm(5);
pause();
kill(hijo1, SIGKILL);
printf("++ Hijo2 Sending Kill signal to Hijo1\n");
printf("++ Proceso Hijo2 terminado\n");
}
else{
/* Padre */
do{
hijoFinalizado = wait(&status); //El hijo finalizado es el que cambia el estado del programa
if(hijoFinalizado == hijo1) statusHijo1 = 1;
else if(hijoFinalizado == hijo2) statusHijo2 = 1;
}while(!statusHijo1 || !statusHijo2);
printf("\n** Soy el padre con PID: %d y he terminado \n", getpid());
}
}
}
这个程序很简单,父亲在等待他的两个孩子,1会等待5秒,直到第二个杀死它。
这里是控制台的输出:
-- Hijo1 PID:29793 | Parent PID:29792
-- Hijo1 Lanzando SIGTERM --
++ Hijo2 PID:29794 | Parent PID:29792
-- Hijo1 awaitting 1 sec..
-- Hijo1 awaitting 1 sec..
-- Hijo1 awaitting 1 sec..
-- Hijo1 awaitting 1 sec..
++ Hijo2 Sending Kill signal to Hijo1
++ Proceso Hijo2 terminado
** Soy el padre con PID: 29792 y he terminado
问题是我不知道hijoFinalizado = wait(&status); 是如何工作的,因为没有它程序就无法运行。
没有它就会发生这种情况:
-- Hijo1 PID:1547 | Parent PID:1546
-- Hijo1 Lanzando SIGTERM --
++ Hijo2 PID:1548 | Parent PID:1546
-- Hijo1 awaitting 1 sec..
-- Hijo1 awaitting 1 sec..
-- Hijo1 awaitting 1 sec..
-- Hijo1 awaitting 1 sec..
++ Hijo2 Sending Kill signal to Hijo1
++ Proceso Hijo2 terminado
然后卡在这里。
¿为什么我没有声明的变量是决定进程是否完成的变量?
¿为什么使用while( (wait(&statusHijo1)!=hijo1)&& (wait(&statusHijo2)!=hijo2) ) ; 是不正确的?
这就是这样做的结果:
-- Hijo1 PID:1148 | Parent PID:1147
++ Hijo2 PID:1149 | Parent PID:1147
-- Hijo1 Lanzando SIGTERM --
-- Hijo1 awaitting 1 sec..
-- Hijo1 awaitting 1 sec..
-- Hijo1 awaitting 1 sec..
-- Hijo1 awaitting 1 sec..
++ Hijo2 Sending Kill signal to Hijo1
++ Proceso Hijo2 terminado
然后卡在这里。
[加法]
¿ trat1 和 trat2 的真正作用是什么?我知道它们很重要,但我不知道为什么。
对不起我的英语,非常感谢。
【问题讨论】:
-
wait()等待任何进程,返回值告诉您哪个进程更改了其状态或是否发生错误。要仅等待特定的子进程,您可以使用waitpid,但即使预期运行时间不同,您也不能绝对确定哪个进程首先终止,因此等待任何子进程是实现此目的的正确方法。 “没有它,程序不起作用”到底是什么意思?发生什么或不发生什么?请edit您的问题澄清这一点,不要在 cmets 中回答。 -
@Bodo 非常感谢您的解释,它对我帮助很大。我已经更新了我的问题并添加了另一个问题。
-
请展示源代码(相关部分)在没有
wait的版本中的样子。
标签: c process signals child-process