Linux系统调用之wait,waitpid函数(进程相关函数)
创始人
2025-06-01 19:45:34
0

前言

如果,想要深入的学习Linux系统调用中的wait,waitpid函数,还是需要去自己阅读Linux系统中的帮助文档。
具体输入命令:

man 2 wait/waitpid

即可查阅到完整的资料信息。

wait函数

它是一个用于等待子进程结束的函数。该函数将暂停当前进程的执行,直到一个子进程结束或收到一个信号为止。当一个子进程结束时,wait函数会返回该子进程的PID(进程ID),并在status参数中返回子进程的退出状态信息。

wait函数的声明如下:

//需要引入的头文件
#include 
#include 
//函数原型
pid_t wait(int *status);
功能:等待任意一个子进程结束,如果任意一个子进程结束了,次函数会回收子进程的资源。参数:int *wstatus进程退出时的状态信息,传入的是一个int类型的地址,传出参数。返回值:- 成功:返回被回收的子进程的id- 失败:-1 (所有的子进程都结束,调用函数失败)

调用wait函数的进程会被挂起(阻塞)直到它的一个子进程退出或者收到一个不能被忽略的信时才被唤醒(相当于继续往下执行)。

如果没有子进程了,函数立刻返回,返回-1如果子进程都已经结束了,也会立即返回,返回-1.

  • 其中,pid_t是一个定义为int类型的数据类型,用于表示进程ID,而参数status是一个指向整数的指针,它是一个传出参数,用于保存子进程的退出状态信息。

退出信息相关宏函数

  • WIFEXITED(status) 非0,进程正常退出
  • WEXITSTATUS(status) 如果上宏为真,获取进程退出的状态(exit的参数)
  • WIFSIGNALED(status) 非0,进程异常终止
  • WTERMSIG(status) 如果上宏为真,获取使进程终止的信号编号
  • WIFSTOPPED(status) 非0,进程处于暂停状态
  • WSTOPSIG(status) 如果上宏为真,获取使进程暂停的信号的编号
  • WIFCONTINUED(status) 非0,进程暂停后已经继续运行

下面是一个wait函数的示例代码:

代码示例:使用wait函数回收子进程资源,并打印进程退出状态

// 导入wait,getpid,fork函数的头文件
// pid_t wait(int *wstatus);
//pid_t fork(void);
//pid_t getpid(void);
#include 
#include 
#include 
#include 
#include int main(){pid_t pid;//循环产生5个子进程for(int i = 0; i < 5; ++i){pid = fork();if(pid == 0) break; //为了不让子进程再产生孙子进程,所以要break掉}if(pid > 0 ){while(1){printf("I am parent process, process id = %d\n",getpid());int st;int ret = wait(&st);if(ret == -1) break; //如果所有子进程死完了,则结束while循环if(WIFEXITED(st)) printf("子进程%d正常退出\n",ret);if(WIFSIGNALED(st)) printf("子进程被%d号信号干掉了\n",WTERMSIG(st));}}if(pid == 0){while(1){printf("I am child process, process id = %d\n",getpid());sleep(50);exit(0);}}printf("所有子进程已杀死\n");return 0;
}

我们可以通过 kill -9 加上进程号 去杀死其中的子进程,观察退出信息相关宏函数的输出内容。

waitpid函数

waitpid()函数是一个用于等待子进程终止的系统调用。与wait()函数不同,waitpid()函数可以指定等待的进程ID,并且提供了更多的选项。

waitpid()函数的原型如下:

//需要引入的头文件,与wait函数相同
#include 
#include 
//函数原型
pid_t waitpid(pid_t pid, int *status, int options);

其中,pid参数指定了要等待的子进程的进程ID,status参数是用于获取子进程的终止状态的指针,options参数指定了waitpid()函数的行为。

pid参数的取值可以有以下几种情况:

  • pid > 0:等待进程ID为pid的子进程结束。
  • pid == 0:等待与当前进程在同一个进程组中的所有子进程结束。
  • pid == -1:等待任何一个子进程结束,与wait()函数相同。
  • pid < -1:等待进程组ID为pid的所有子进程结束。

status参数是一个指向整型变量的指针,用于获取子进程的退出状态,这一点与wait函数相同。当waitpid()函数返回时,如果status不为NULL,则子进程的退出状态会被存储在status指向的变量中。如果status为空,则子进程的退出状态会被忽略。

options参数是一个控制waitpid()函数行为的标志位,它可以取以下值:

  • WNOHANG:如果没有子进程结束,则立即返回0,不阻塞。
  • WUNTRACED:如果子进程进入暂停状态,也立即返回。
  • WCONTINUED:如果子进程恢复执行,则立即返回。
  • WSTOPPED:等待任何一个子进程进入暂停状态。
  • WEXITED:等待任何一个子进程结束。
  • WNOWAIT:不删除已经结束子进程的进程表项,用于后续处理。

waitpid()函数返回值有以下几种情况:

  1. 返回结束子进程的进程ID。
  2. 如果WNOHANG标志被设置并且没有子进程结束,则返回0。
  3. 如果调用进程没有子进程,则返回-1,并设置errno为ECHILD。
  4. 如果调用被一个信号中断,则返回-1,并设置errno为EINTR。

总之,waitpid()函数是一个强大的进程管理函数,可以精确地控制进程的等待和处理。

下面是一个wait函数的示例代码:

代码示例:使用waitpid函数回收子进程资源,并打印进程退出状态

// 导入函数的头文件
#include 
#include 
#include 
#include 
#include int main(){pid_t pid;//循环产生5个子进程for(int i = 0; i < 5; ++i){pid = fork();if(pid == 0) break; //为了不让子进程再产生孙子进程,所以要break掉}if(pid > 0 ){while(1){printf("I am parent process, process id = %d\n",getpid());sleep(15);int st;//用来获取信号int ret = waitpid(-1,&st,WNOHANG);if(ret == -1){perror("waitpid");break; } if(ret == 0) continue;if(WIFEXITED(st)) printf("子进程%d正常退出\n",ret);if(WIFSIGNALED(st)) printf("子进程被%d号信号干掉了\n",WTERMSIG(st));  }}if(pid == 0){while(1){printf("I am child process, process id = %d\n",getpid());sleep(50);exit(0);}}return 0;
}

相关内容

热门资讯

全球旅行商48小时“嗨玩北京”... 来源:环球网【环球网文旅报道】6月1日至2日,来自全球40多个国家和地区的270多位旅行商齐聚北京,...
小店“因爱重生”网友称在这找回... 小店“因爱重生”网友称在这找回童年 央视网消息:等待着下课,等待着放学,等待着去肥娟小吃店。在广东...
小小樱桃营养高,这类人却要当心... “流光容易把人抛,红了樱桃,绿了芭蕉。”南宋词人蒋捷笔下的樱桃,正应了当下红艳艳的樱桃挂满枝头,走向...
原创 小... “小暑大暑,上蒸下煮”,这话真是一点不假!小暑一到,这天气热得跟蒸笼似的,人稍微一动就一身汗,浑身黏...
广东中山火炬高新区民众街道进入... 六月的风里已经飘来荔枝的香甜,岭南的丹荔枝头已悄然挂满“红灯笼”。眼下,中山火炬高新区民众街道各果园...
建议少吃牛羊肉,多食8道菜,清... 夏日炎炎,骄阳似火,人体易受暑热侵袭,出现燥热、乏力等不适症状。在这个时节,饮食的选择至关重要。牛羊...
备考黄金期!8道营养菜,孩子爱... 在孩子备考的关键时期,营养的补给至关重要。这不仅能为孩子提供充足的能量,保持良好的学习状态,还能助力...
端午吃八样,不富也安康,端午节... 端午节,这个承载着深厚文化底蕴的传统节日,不仅有赛龙舟的激昂,更有美食带来的温馨与祝福。这八样美食,...
原创 马... 第一次听说马来西亚有个世代生活在海上的村子,我还以为是谁在跟我讲小说呢!直到刷到当地渔民家孩子在清澈...
黄山3天2晚自由行路线价格,黄... 黄山,这座闻名遐迩的名山,以其奇松、怪石、云海、温泉四绝著称于世,吸引着无数游客前来探寻它的魅力。我...
2025“国际山地旅游日”主题... 当地时间5月29日,2025“国际山地旅游日”主题活动在西班牙大加那利岛启幕。本届活动以“山海相拥·...
四川成都旅游跟团划算还是自己去... 四川成都旅游跟团划算还是自己去划算,四川成都旅游必去十大景点排名 在规划一场前往四川成都的旅行时,不...
江西旅游攻略四日游旅游行程,江... 江西旅游攻略四日游旅游行程,江西4天3晚纯玩团旅游线路! 对于热爱旅行的我来说,每一次出发都是一次全...
四川成都旅游攻略,四川成都游玩... 四川成都旅游攻略,四川成都游玩三天多少钱 在旅行的梦想清单里,四川成都宛如一颗璀璨的明珠,散发着独特...
乡村特色旅游助力农民增收致富 在广袤的中华大地上,乡村不仅是农业生产的基地,更是承载着深厚文化底蕴与自然风光的宝藏之地。近年来,随...
山西天镇全力打造边塞文化旅游打... 春的脚步渐行渐远,夏的热情悄然而至。端午小长假,位于山西省大同市天镇县东北部的传统长城村落薛三墩村游...
端午巧遇儿童节带动亲子游热潮 参考消息网6月3日报道据拉美社6月1日报道,在端午假期第二天即6月1日,中国铁路系统迎来约1190万...
小长假游大连,收获满满! 端午粽香 相遇六一童趣 传统文化融合童趣体验 这个小长假 民俗体验游 热度攀升 大连各景区景点推...
四川九寨沟乐山大佛旅游攻略跟团... 标题:《我的四川五日游:跟着本地团导游乐乐,玩转九寨沟和乐山大佛》 四川旅游推荐!当地导游-乐乐:1...
四川旅游攻略自由行攻略旅行团6... 四川的奇妙之旅:亲身体验天府之国的魅力 四川旅游推荐!当地导游-乐乐:185 8335 5758(加...