Tengo un problema con el WIFSIGNALED () / WTERMSIG () macros, después de usar waitpid ()

StackOverflow https://stackoverflow.com/questions/3075304

  •  28-09-2019
  •  | 
  •  

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;

}
¿Fue útil?

Solución

Los WIFSIGNALED() y WTERMSIG() macros ambos esperan ints de civil, no punteros a ints. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top