首页 > 代码库 > 一、进程与信号之进程相关系统调用

一、进程与信号之进程相关系统调用

进程调用函数wait(),waitpid()

#include <sys/types.h>#include <sys/wait.h>pid_t wait(int *status)  //等待所有子进程,返回任一终止子进程的状态,阻塞方式pid_t waitpid(pid_t pid,int *status,int options)//指定子进程pid等待终止返回,option设置是否阻塞

status参数

  为空时,代表任意状态结束的子进程,若不为空,则代表指定状态结束的子进程

检查wait和waitpid函数返回终止状态的宏

  WIFEXITED/WEXITSTATUS(status)

    若为正常终止子进程返回的状态,则为真

  WIFSIGNALED/WSTOPSIG(status)

    若为异常终止子进程返回的状态,则为真(接不到一个不能捕捉的信号)

option参数

  WNOHANG

    若由pid指定的子进程没有退出则立即返回,则waitpid不阻塞,此时返回值为0

  WUNTRACED

    若某实现支持作业控制,则由pid指定的任一子进程已暂停,且其状态自暂停依赖还未报告过,则返回其状态

进程函数wait范列

#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <string.h>#include <sys/types.h>#include <sys/wait.h>void out_status(int status){    //通过宏来分析子进程是哪种退出方式    if(WIFEXITED(status))    {        printf("normal exit: %d\n",WEXITSTATUS(status));    }    else if(WIFSIGNALED(status))    {        printf("abnormal term: %d\n",WTERMSIG(status));    }    else if(WIFSTOPPED(status))    {        printf("stopped sig: %d\n",WSTOPSIG(status));    }    else    {        printf("unknow sig\n");    }}int main(void){    int status;    pid_t pid;        if((pid=fork())<0)    {        printf("fork error");        exit(1);    }    else if(pid == 0)    {        //结束子进程        printf("pid: %d,ppid: %d\n",getpid(),getppid());        exit(3);     }    //设置父进程的wait的阻塞,等待回收子进程     wait(&status);    out_status(status);    printf("---------------------------\n");            if((pid=fork())<0)    {        printf("fork error");        exit(1);    }    else if(pid == 0)    {        //结束子进程        printf("pid: %d,ppid: %d\n",getpid(),getppid());        int i=3,j=0;        int k=i/j;        printf("k: %d\n",k);    }    //设置父进程的wait的阻塞,等待回收子进程     wait(&status);    out_status(status);    printf("---------------------------\n");                if((pid=fork())<0)    {        printf("fork error");        exit(1);    }    else if(pid == 0)    {        //结束子进程        printf("pid: %d,ppid: %d\n",getpid(),getppid());        pause();//进程暂停,通过信号结束进程     }    //设置父进程的wait的阻塞,等待回收子进程     wait(&status);    out_status(status);    printf("---------------------------\n");                if((pid=fork())<0)    {        printf("fork error");        exit(1);    }    else if(pid == 0)    {        //结束子进程        printf("pid: %d,ppid: %d\n",getpid(),getppid());        //pause(),通过死循环阻塞         int i=0;        while(++i)        {            sleep(1);        }    }    //设置父进程的wait的阻塞,等待回收子进程     wait(&status);    out_status(status);    printf("---------------------------\n");}

编译执行,并在另一个终端kill子进程,打印出子进程结束方式

pid: 2834,ppid: 2833normal exit: 3---------------------------pid: 2835,ppid: 2833abnormal term: 8---------------------------pid: 2837,ppid: 2833abnormal term: 9---------------------------pid: 2841,ppid: 2833abnormal term: 9---------------------------

 

一、进程与信号之进程相关系统调用