zoukankan      html  css  js  c++  java
  • <转载>Wait and Waitpid

    转载http://www.cnblogs.com/lihaosky/articles/1673341.html

    一、Wait

    #include <sys/types.h> /* 提供类型pid_t的定义 */ 	
    #include <sys/wait.h> 	
    pid_t wait(int *status) 
    

    简介

      进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进 程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。

      参数status用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。但如果我们对这个子进程是如何死掉的毫不在意,只想把这个僵尸进程消灭掉,(事实上绝大多数情况下,我们都会这样想),我们就可以设定这个参数为NULL,就象下面这样:

    pid = wait(NULL); 
    

    如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。

    实战

    /* wait1.c */
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <stdlib.h>
    main()
    {
    	pid_t pc,pr;
    	pc=fork();
    	if(pc<0) 		/* 如果出错 */
    		printf("error ocurred!
    ");
    	else if(pc==0){		/* 如果是子进程 */ 
    		printf("This is child process with pid of %d
    ",getpid());
    		sleep(10);	/* 睡眠10秒钟 */
    	}
    	else{			/* 如果是父进程 */
    		pr=wait(NULL);	/* 在这里等待 */
    		printf("I catched a child process with pid of %d
    "),pr);
    	}		
    	exit(0);
    }
    

    下面

    编译并运行:

    $ cc wait1.c -o wait1 $ ./wait1 This is child process with pid of 1508 I catched a child process with pid of 1508
    

      可以明显注意到,在第2行结果打印出来前有10秒钟的等待时间,这就是我们设定的让子进程睡眠的时间,只有子进程从睡眠中苏醒过来,它才能正常退 出,也就才能被父进程捕捉到。其实这里我们不管设定子进程睡眠的时间有多长,父进程都会一直等待下去,读者如果有兴趣的话,可以试着自己修改一下这个数 值,看看会出现怎样的结果。

     

  • 相关阅读:
    centos下网络的基本配置方法讲解
    win8.1环境下硬盘安装centos6.5双系统
    新人出世
    Docker 仓库管理
    Docker Dockerfile
    Docker image创建之Hello world
    ASP.Net Core 发布到 Centos Docker
    C# 人工智能
    C#使用ML.Net完成人工智能预测
    无监督和有监督算法的区别
  • 原文地址:https://www.cnblogs.com/ztteng/p/3381760.html
Copyright © 2011-2022 走看看