217LeeSin
217LeeSin

Reputation: 123

In c, linux , about kill and raise

I run my C program on debian-linux ,the program is expected to output

$ ./kill_raise
Child(pid : 4877) is waiting for any signal
Parent kill 4877

but I just got

Parent kill 4877

the string in subprocess (Child(pid : %d) is waiting for any signal) is not print out,why?

and this is my program

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>


int main(int argc, char *argv[])
{
    pid_t pid;
    int res;

    pid = fork();
    if (pid < 0)
    {
        perror ("Fork error\n");
        exit(0);
    }

    if (pid == 0)
    {
        printf ("child(pid:%d) is waiting for signal\n", getpid());
        raise(SIGSTOP);
        exit(0);
    }

    else
    {
        if ((waitpid(pid, NULL, WNOHANG)) == 0)
        {
            if ((res = kill(pid, SIGKILL)) == 0)
            {
               printf ("parent kill %d\n", pid); 
            }
        }

        waitpid(pid, NULL, 0);
        exit(0);

    }
}

Upvotes: 0

Views: 1186

Answers (1)

You're hitting a race condition. The parent is executing the kill before the child can execute its printf. Remove WNOHANG so the parent actually waits for the child to stop. Also, you need to add WUNTRACED so that waitpid reports the stop (by default, it will only report termination). Finally, you shouldn't be testing wait()'s return value against 0 in this case.

Upvotes: 1

Related Questions