进程控制相关系统调用(2)

WEXITSTATUS与WIFEXITED宏的使用
#include <sys/types.h>
#include <sys/uio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
    pid_t cid;
    int pr, status;
    cid = fork();
    if (cid < 0) {
        perror("子进程创建失败!");
    } else {
        if (cid == 0) {
            printf("子进程工作PID=%d,父进程PID=%d\n", getpid(),getppid());
            sleep(20);
            exit(3);
        } else {
            pr = wait(&status);
            if (WIFEXITED(status)) {
                printf("父进程工作PID=%d\n", getpid());
                printf("WAIT返回值=%d\n", pr);
                printf("子进程正常退出PID=%d\n", getpid());
                printf("WIFEXITED(status)=%d\n", WIFEXITED(status));
                printf("WEXITSTATUS(status)=%d\n", WEXITSTATUS(status));
            } else {
                printf("子进程异常退出PID=%d,信号=%d\n", getpid(), status);
                printf("WAIT返回值=%d\n", pr);
            }
        }
    }
    return 0;
}
基于上面代码做出分析:

1.      子进程正常退出

控制台输出信息如下:

子进程工作PID=12070,父进程PID=12069

(20S后…..)

父进程工作PID=12069

WAIT返回值=12070

子进程正常退出PID=12069

WIFEXITED(status)=1

WEXITSTATUS(status)=3

2.      子进程异常退出

作法:

运行程序,在子进程SLEEP期间,杀死子进程

[root@localhost Debug]# kill -9 11990

控制台台输出如下

子进程工作PID=11990,父进程PID=11985

(kill -9 PID 杀死子进程)

子进程异常退出PID=11985,信号=9

可以看出子进程正常退出时,status返回值是exit的退出值,子进程异常退出时status返回值信号值

waitpid函数使用
waitpid的参数说明

参数pid的值有以下几种类型:
pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去.
pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样.
pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬.
pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值.

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

转载注明出处:http://www.heiqu.com/18649.html