zoukankan      html  css  js  c++  java
  • 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
    参数
    pid pid == -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;
    }
    

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

  • 相关阅读:
    HDU_1846 Brave Game(sg函数简化版)
    POJ 3225 Help with Intervals(线段树)
    ZOJ_3501 Roman Order
    HDU_1527 取石子游戏(威佐夫博弈)
    HDU_2112 HDU Today(DIjkstra + map映射)
    HDU_3339 In Action(Dijkstra + DP)
    单链表的实现(课本上的算法)
    haproxy 基于 uri 实现调度
    haproxy 基于 cookie 实现 session 绑定
    [转]ASP.NET 虚拟主机安全漏洞解决方案
  • 原文地址:https://www.cnblogs.com/EngineerZhang/p/9351785.html
Copyright © 2011-2022 走看看