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秒钟的等待时间,这就是我们设定的让子进程睡眠的时间,只有子进程从睡眠中苏醒过来,它才能正常退 出,也就才能被父进程捕捉到。其实这里我们不管设定子进程睡眠的时间有多长,父进程都会一直等待下去,读者如果有兴趣的话,可以试着自己修改一下这个数 值,看看会出现怎样的结果。

     

  • 相关阅读:
    联想 Vibe Shot(Z90-3) 免recovery 获取ROOT权限 救砖 VIBEUI V3.1_1625
    联想 Z5S(L78071)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 10.5.370
    联想 Z5(L78011) 免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 10.5.254
    联想 S5 Pro(L78041)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 5.0.123
    第二阶段 冲刺八
    第二阶段 冲刺七
    第二阶段 冲刺六
    第二阶段 冲刺五
    代码大全阅读笔记03
    学习进度十二
  • 原文地址:https://www.cnblogs.com/ztteng/p/3381760.html
Copyright © 2011-2022 走看看