Tengo un problema con el WIFSIGNALED () / WTERMSIG () macros, después de usar waitpid ()
Pregunta
En este código Ci lanzar un programa desde la línea de comandos y cuando está cerrado desde una diferente de la señal de SIGTERM (señal de final normal) mi código debe relanzar el programa inicial transcurrido desde la línea de comandos. Pero no es así, de hecho mi código no relaunchs programa diciendo que es adecuadamente terminated.In practicar mi condición "si (WTERMSIG (estado)! = SIGTERM)" funciona mal, ¿por qué ????? : '(
Este es mi código:
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char*argv[])
{
pid_t pid;
int* status=(int*)malloc(sizeof(int));
int term;
if(argc<2)
{
printf("Error: Too few arguments\n");
exit(EXIT_FAILURE);
}
while(1)
{
pid=fork();
if(pid!=0) /*father*/
{
waitpid(pid,status,0);
//term=WIFSIGNALED(status);
if(WIFSIGNALED(status))
{
if(WTERMSIG(status)!=SIGTERM)
{
printf("The program %d ended abnormally:\nRelaunching...\n",pid);
sleep(1);
}
else
printf("The program %d is properly terminated...\n",pid);
break;
}
else
{
printf("Can not read the reason for termination\n");
}
}
else /*child*/
{
execvp(argv[1],argv+1);
exit(EXIT_SUCCESS);
}
}
return 1;
}
Solución
Los WIFSIGNALED()
y WTERMSIG()
macros ambos esperan int
s de civil, no punteros a int
s. Esto significa que en su código, donde status
es un puntero a un int, es necesario el uso *status
cuando se llama a las macros, para pasarlos al valor del entero.
Dicho esto: ¿por qué llama malloc()
para asignar espacio para una sola int
, de todos modos? Sólo tiene que utilizar una variable normal, y &status
si necesita un puntero a él.
Además, se debe devolver EXIT_SUCCESS
de main()
la finalización con éxito de su programa, no 1
.