`
hulianwang2014
  • 浏览: 681299 次
文章分类
社区版块
存档分类
最新评论
  • bcworld: 排版成这样,一点看的欲望都没有了
    jfinal

linux下的进程等待(wait和waitpid)

 
阅读更多

wait(等待子进程中断或结束)

表头文件
#include<sys/types.h>
#include<sys/wait.h>
定义函数 pid_t wait (int * status);
函数说明:
wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。
如果在调用 wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值。
子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一起返回。
如果不在意结束状态值,则参数 status 可以设成 NULL。
子进程的结束状态值请参考 waitpid( )
如果执行成功则返回子进程识别码(PID) ,如果有错误发生则返回返回值-1。失败原因存于 errno 中。
pid_t pid1; int status=0;
i=wait(&status);
i返回的是子进程的识别码;PID
status中存的是子进程的结束状态;可用WEXITSTATUS(status)得到子进程的exit(3)的状态,那么就是3;
waitpid(等待子进程中断或结束)
表头文件
#include<sys/types.h>
#include<sys/wait.h>
定义函数 pid_t waitpid(pid_t pid,int * status,int options);
函数说明:
waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。
如果在调用 wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值。
子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一快返回。
如果不在意结束状态值,则参数 status 可以设成 NULL。
参数 pid 为欲等待的子进程识别码,其他数值意义如下:
pid<-1 等待进程组识别码为 pid 绝对值的任何子进程。
pid=-1 等待任何子进程,相当于 wait()。
pid=0 等待进程组识别码与目前进程相同的任何子进程。
pid>0 等待任何子进程识别码为 pid 的子进程。
参数 option 可以为 0 或下面的 OR 组合:
WNOHANG 如果没有任何已经结束的子进程则马上返回, 不予以等待。
WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。
子进程的结束状态返回后存于 status,底下有几个宏可判别结束情况:
WIFEXITED(status)如果子进程正常结束则为非 0 值。
WEXITSTATUS(status)取得子进程 exit()返回的结束代码,一般会先用 WIFEXITED 来判断是否正常结束才能使用此宏。
WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真
WTERMSIG(status) 取得子进程因信号而中止的信号代码,一般会先用 WIFSIGNALED 来判断后才使用此宏。
WIFSTOPPED(status) 如果子进程处于暂停执行情况则此宏值为真。一般只有使用 WUNTRACED 时才会有此情况。
WSTOPSIG(status) 取得引发子进程暂停的信号代码,一般会先用 WIFSTOPPED 来判断后才使用此宏。
如果执行成功则返回子进程识别码(PID) ,如果有错误发生则返回返回值-1。失败原因存于 errno 中。
oot@wl-MS-7673:/home/wl/桌面/c++# cat -n wait.cpp 
     1	#include <unistd.h>
     2	#include <sys/types.h>
     3	#include <sys/wait.h>
     4	#include <stdio.h>
     5	#include <stdlib.h>
     6	#include <errno.h>
     7	#include <math.h>
     8	
     9	/*
    10	 * 程序入口
    11	 * */
    12	int main(void)
    13	{
    14		pid_t child;
    15	
    16		/* 创建子进程 */
    17		if((child=fork())==-1)
    18		{
    19			printf("Fork Error \n" );
    20			exit(1);
    21		}
    22		else 
    23		{
    24			if(child==0) // 子进程
    25			{
    26				printf("the child process is run\n");
    27				sleep(1);  //子进程睡眠一秒,但并没有去运行父进程
    28				printf("I am the child: %d\n", getpid());
    29				exit(0);
    30			}
    31			else        //父进程
    32			{
    33				wait(NULL); //等到子进程退出,父进程才会运行
    34				printf("the father process is run\n");
    35				printf("I am the father:%d\n",getpid());
    36				return 0;
    37			}
    38		}
    39	}	
    40	
    41	
root@wl-MS-7673:/home/wl/桌面/c++# g++ wait.cpp -o wait
root@wl-MS-7673:/home/wl/桌面/c++# ./wait 
the child process is run
I am the child: 19742
the father process is run
I am the father:19741
root@wl-MS-7673:/home/wl/桌面/c++# ./wait 

本例子中,父进程等待子进程结束后才执行。~

分享到:
评论

相关推荐

    【Linux】进程二 (PCB & fork/vfork & wait/waitpid & exit/_exit & exec函数族 & 环境变量)

    ·我们称为PCB,Linux操作系统下的PCB是:task struct 2、task_struct——PCB的一种 ·在Linux中描述进程的结构体叫做task_struct. ·task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里包含着进程的...

    Linux中僵尸进程和孤儿进程详解

    一个子进程在其父进程没有调用wait()或waitpid()的情况下退出,这个子进程就是僵尸进程。如果其父进程还存在而一直不调用wait,则该僵尸进程将无法回收,等到其父进程退出后该进程将被init回收。 运行结果 2、孤儿...

    详解linux下避免僵尸进程的几种方法

    linux下我们可以调用fork函数创建子进程,创建的子进程将会得到父进程的数据空间、堆、栈……副本(采用写时复制机制),子进程将会继承父进程的信号掩码、信号处理方式、当前工作目录、会话id、组id……。当子进程...

    什么是PHP7中的孤儿进程与僵尸进程

    我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个 进程完成它的工作终止...

    waitforpid:使用 Linux 的 PROC_EVENTS 和 POSIX 功能等待(非子)进程退出

    等待使用 Linux 的PROC_EVENTS等待(非子)进程退出。 由于CAP_NET_ADMIN POSIX 功能允许用于waitforpid二进制文件,因此不需要将其设置为 suid root。安装您需要一个启用了CONFIG_PROC_EVENTS的 Linux 内核。 克隆...

    一个进程池的服务器程序

    一个进程池的服务器程序 ... 流程大概如下: 1,父进程listen,创建pipe(下面所有父子进程之间的通信都用该... if (read(fd1[0], &rep, sizeof(rep)) (rep)) {//等待子进程发来消息 perror("parent read pipe failed...

    Linux内核中的进程(二)

    在Linux中,通过fork创建子进程,子进程通过exit()系统调用终结进程并将其占用的资源释放掉,此时子进程被设置为僵死状态,父进程可以通过wait()或waitpid()系统调用查询子进程是否终结。  内核把进程的列表存放...

    linux系统编程之线程.zip

    阻塞等待线程退出,获取线程退出状态 其作用,对应进程中 waitpid() 函数。 int pthread_join(pthread_t thread, void **retval); 成功:0;失败:错误号 参数:thread:线程ID (【注意】:不是指针);retval:...

    linux_c API函数大全

    LINUX C函数库API 1.字符测试篇 15 1.1 15 isalnum(测试字符是否...waitpid(等待子进程中断或结束) 111 11.23 112 fprintf(格式化输出数据至文件) 112 11.24 112 fscanf(格式化字符串输入) 112 ... ... ... ...

    大部分代码,关于创建与回收进程

    文件中包含本博客中的大部分代码,以及其他代码供读者取用,可以在Linux上运行,感受fork、wait、waitpid函数的作用

    高级UNIX编程 pdf 电子书

    5.9 信号、终止和等待 5.10 实现shell(版本3) 5.11 获得用户ID和组ID 5.12 设置用户ID和组ID 5.13 获得进程ID 5.14 chroot系统调用 5.15 获得并设置优先级 5.16 进程限制 5.17 线程介绍 5.18 阻塞问题 练习 第6章 ...

    Android Init进程对信号的处理流程详细介绍

    并且父进程需要调用wait()或waitpid()等待子进程结束。如果父进程没有做这种处理,且父进程初始化时也没有调用signal(SIGCHLD, SIG_IGN)来显示忽略对SIGCHLD的处理,这时子进程将一直保持当前的退出状态,不会完全...

    Linux C 一站式学习

    3.3. wait和waitpid函数 4. 进程间通信 4.1. 管道 4.2. 其它IPC机制 5. 练习:实现简单的Shell 31. Shell脚本 1. Shell的历史 2. Shell如何执行命令 2.1. 执行交互式命令 2.2. 执行脚本 3. Shell的基本语法 3.1. ...

    UNIX环境高级编程_第二版中文

    8.6 wait和waitpid函数  8.7 waitid函数  8.8 wait3和wait4函数  8.9 竞争条件  8.10 exec函数  8.11 更改用户ID和组ID  8.12 解释器文件  8.13 system函数  8.14 进程会计  8.15 用户标识  ...

    UNIX环境高级编程(第二版中文)

    8.6 wait和waitpid函数 179 8.7 waitid函数 183 8.8 wait3和wait4函数 184 8.9 竞争条件 185 8.10 exec函数 188 8.11 更改用户ID和组ID 192 8.12 解释器文件 196 8.13 system函数 200 8.14 进程...

    unix环境编程电子书

    164 7.12 小结 168 习题 168 第8章 进程控制 171 8.1 引言 171 8.2 进程标识符 171 8.3 fork函数 172 8.4 vfork函数 176 8.5 exit函数 178 8.6 wait和waitpid函数 179 8.7 waitid函数 183 8.8 ...

    UNIX环境高级编程

    8.6 wait和waitpid函数 179 8.7 waitid函数 183 8.8 wait3和wait4函数 184 8.9 竞争条件 185 8.10 exec函数 188 8.11 更改用户ID和组ID 192 8.12 解释器文件 196 8.13 system函数 200 8.14 进程...

Global site tag (gtag.js) - Google Analytics