Linux监听子线程的函数(2)

出错值可能有下面这些
ECHILD:参数指定的进程不存在,或者并非调用进程的子进程
EINTR;WNOHANG不被设置,同时捕捉到一个不被阻塞的信号或SIGCHLD信号
EINVAL:options参数无效

例子:

$ ./a.out &
Child PID is 32360
[1] 32359
$ kill -STOP 32360
stopped by signal 19
$ kill -CONT 32360
continued
$ kill -TERM 32360
killed by signal 15
[1]+  Done                    ./a.out
$

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

int main(int argc, char *argv[])
{
    pid_t cpid, w;
    int status;

cpid = fork();
    if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); }

if (cpid == 0) {            /* 子进程执行 */
        printf("Child PID is %ld\n", (long) getpid());
  if (argc == 1)
            pause();                    /* Wait for signals */
        _exit(atoi(argv[1]));

} else {                    /* 父进程执行 */
        do {
            w = waitpid(cpid, &status, WUNTRACED | WCONTINUED);
            if (w == -1) { perror("waitpid"); exit(EXIT_FAILURE); }

if (WIFEXITED(status)) {
                printf("exited, status=%d\n", WEXITSTATUS(status));
            } else if (WIFSIGNALED(status)) {
                printf("killed by signal %d\n", WTERMSIG(status));
            } else if (WIFSTOPPED(status)) {
                printf("stopped by signal %d\n", WSTOPSIG(status));
            } else if (WIFCONTINUED(status)) {
                printf("continued\n");
            }
        } while (!WIFEXITED(status) && !WIFSIGNALED(status));
        exit(EXIT_SUCCESS);
    }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/24081.html