[Linux]进程信号阻断机制

作者: 忆往 分类: Linuxの生涯,学习の生涯 发布时间: 2018-07-10 11:23

函数原型:pid_t wait(int *wstatus);

头文件:<sys/types.h>   <sys/wait.h>

WIFEXITED(status) :这个宏用来指出子进程是否为正常退出的
如果是,它会返回一个非零值(请注意,虽然名字一样,这里的参数status并不同于wait唯一的参数---指向整数的指针status,而是那个指针所指向的整数,切记不要搞混了)

WEXITSTATUS(status) 当WIFEXITED返回非零值时,我们可以用这个宏来提取子进程的返回值
如果子进程调用exit(5)退出,WEXITSTATUS(status)就会返回5;
如果子进程调用exit(7),WEXITSTATUS(status)就会返回7。
请注意,如果进程不是正常退出的,也就是说,WIFEXITED返回0,这个值就毫无意义。

WIFSIGNLED(status) 这个宏用来指出子进程是否被信号中断的
如果是,它会返回一个非零值

WTERMSIG(status)如果上面宏的判断条件成立,那么就会返回打断这个子进程的信号ID

源代码

/*************************************************************************
    > File Name: day31_02_wait.c
    > Author:Guanwei(Kevin.G) 
    > Mail:413014792@qq.com 
    > Function: 
    > Created Time: 2018年07月10日 星期二 10时43分02秒
 ************************************************************************/

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

void warning(int n,void* text)
{
    printf("错误代码:%d\n错误原因:%s\n",n,(char*)text);
}

int main()
{
    int status;
    pid_t pc,pr;
    pc=fork();

    if(pc==-1)
    {
        char* error="子进程开启失败";
        on_exit(warning,error);
        exit(-1);
    }

    if(pc==0)
    {
        printf("子进程正在执行!\n");
        sleep(20);
    }
    else
    {
        pr=wait(&status);
        printf("父进程执行\n");
        if(WIFEXITED(status))
        {
             /* 如果WIFEXITED返回非零值 */
             printf("the child process %d exit normally.\n",pr);
             printf("the return code is %d.\n",WEXITSTATUS(status));
        }
        else /* 如果WIFEXITED返回零 */
        {
            printf("the child process %d exit abnormally.\n",pr);
        }

        if(WIFSIGNALED(status)) //如果是被信号打断的
        {
            printf("The child is aborted by single:%d\n",WTERMSIG(status));
        }

    }

    return 0;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注