exit,_exit,wait,waitpid

exit,_exit,wait,waitpid

目录


1.exit()和_exit()

进程一般有两种退出方式,一种是异常终止,如调用abort(),另一种是使用exit()和_exit()系统调用正常终止。
![](https://images2018.cnblogs.com/blog/1435096/201807/1435096-20180722223435245-1566831687.png)


由上图片可知,exit与_exit区别:
1)exit会执行调用退出处理程序
2)exit会执行清除I/O缓存

接下来分别对于上述两个区别加以分析。

①区别一

首先,说一下退出处理程序产生的原因:以一个应用程序库为例,如果进程使用了该程序库,那么在进程终止前该库需要执行一些清理操作,由于库本身无法要求在进程退出前调用库中特定的清理函数,所以可以使用退出处理程序。退出处理程序是由程序员设计的函数,在进程调用exit()函数正常终止时自动执行。
可以使用atexit()函数注册退出处理程序。终止处理程序的调用与注册次序相反。
int atexit(void (*function)(void))
返回值若成功则为0,若出错则为非零
void bye1(void)
{
    printf("bye1...do\n");
}

void bye2(void)
{
    printf("bye2...do\n");
}

int main()
{

    atexit(bye1);
    atexit(bye2);
    printf("hello....");
    exit(0);
}

②区别二

int main(void)
{
    printf("hello。。。");
    //exit(0);      
    fflush(stdout);   //fflush(NULL);
    _exit(0);       //若没有fflush,打印不出东西
}

2.wait和waitpid

当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止)。
子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程,它只保留最小的一些内核数据结构,以便父进程使用wait/waitpid查询子进程的退出状态。
pid_t wait(int *status)
参数状态信息
返回值若成功则为子进程的ID,若出错则为-1
wait系统调用会使父进程暂停执行,直到它的一个子进程结束为止。
pid_t waitpid(pid_t pid, int *status,int options)
作用用来等待某个特定进程的结束
返回值若成功则为子进程的ID,若出错则为-1
参数
pidpid == -1:等待任一子进程
pid > 0:等待其进程ID与pid相等的子进程
pid == 0: 等待与调用者进程同在一个组的进程
pid < -1: 等待其组ID等于pid的绝对值的任一子进程
status状态信息
options改变waitpid的行为,WNOHANG:防止waitpid把调用者的执行挂起

3.小demo

void TestFunc(int loopnum)
{
    printf("loopnum:%d\n", loopnum);
}

int main(void )
{
    int procnum = 10;
    int loopnum = 100;


    int i = 0, j = 0;
    printf("please enter you procNum : \n");
    scanf("%d", &procnum);

    printf("please enter you loopnum :\n");
    scanf("%d", &loopnum);

    pid_t pid;

    for (i=0; i<procnum; i++)
    {
        pid = fork();
        if (pid == 0)
        {
            for (j=0; j<loopnum; j ++)
            {
                TestFunc(j);
            }
            exit(0);
        }
    }

    //父进程能监控所有子进程的退出,避免僵尸进程
    int mypid;
    while ((mypdi=waitpid(-1,NULL,WNOHANG)) > 0)
    {
        ;
    }
    

    printf("hello...\n");
    return 0;
}

以上演示了父进程能监控所有子进程的退出,避免僵尸进程。

posted @ 2018-07-22 22:33 神秘的火柴人 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值