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

news2024/11/19 2:31:11

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.coloradmin.cn/o/149172.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

12、Java基础之泛型的使用

一、泛型的理解1、泛型的概念所谓泛型&#xff0c;就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时&#xff08;例如&#xff0c; 继承或实现这个接口&#xff0c;用这个类型声明变量、创建对象时&#…

[游戏测试]基于人工智能博弈树,极大极小(Minimax)搜索算法并使用Alpha-Beta剪枝算法优化实现的可人机博弈的AI智能五子棋游戏。

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; (*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &a…

关于idea中查看源码时的注释以及.class与.java文件的问题

文章目录问题描述解决方法问题描述 在使用idea编辑器学习java的时候发现有的人的idea将鼠标方法java自带的类方法上会出现解释注释&#xff0c;但是我的idea不可以&#xff0c;经过查询发现是idea中jdk选择的问题。 下图为能查看注释时的截图 按住ctrl点击方法名进入&#x…

分治和递归

目录 分治的概念&#xff1a; 递归的概念&#xff1a; 分治策略的特征&#xff1a; 分治法步骤&#xff1a; 例&#xff1a;阶乘&#xff01; 迭代 递归 关于递归使用栈 斐波拉切数列 迭代 递归 分治的概念&#xff1a; 将一个难以直接解决的大问题&#xff08;规模大…

【年终总结】我的前端之行,回顾2022,展望2023

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;前端领域新星创作者、华为云享专家、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff…

Vivado综合属性之MAX_FANOUT

本文介绍了综合属性MAX_FANOUT对Schematic的影响&#xff0c;通过本文可以理解通过寄存器复制的方式可以降低扇出。 高扇出信号可能会因为布线拥塞而出现时序问题。常用的规避方法是通过寄存器复制的方式降低扇出&#xff0c;可通过MAX_FANOUT实现寄存器复制。 MAX_FANOUT既可…

为金融业保驾护航,浪潮存储容灾方案获得权威媒体认可

近日&#xff0c;在2022中国金融科技年会上&#xff0c;经权威IT专家多项严格评审&#xff0c;浪潮金融行业数据存储与容灾解决方案&#xff0c;凭借安全、可靠、经济、高效四大优势&#xff0c;能够满足金融业务服务永远在线、数据永不丢失、性能永远满足、容量永远充足的核心…

【Linux】Linux编译器 gcc 的使用 | 动静态库的初步认识

&#x1f451;作者主页&#xff1a;进击的安度因 &#x1f3e0;学习社区&#xff1a;进击的安度因&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux 文章目录一、前言二、gcc 演示翻译环境1、预处理2、编译3、汇编4、链接5、总结三、动静态链接库1、库…

代码随想录算法训练营第6天 1.两数之和、242. 有效的字母异位词、349.两个数组的交集

代码随想录算法训练营第6天 1.两数之和、242. 有效的字母异位词、349.两个数组的交集 两数之和 力扣题目链接(opens new window) 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 首…

JS数字日期转中文日期(封装函数,dayjs转换时间格式)

JS数字日期转中文日期往期相关文章场景复现封装函数&#xff08;数字日期转中文日期&#xff09;实际应用往期相关文章 文章内容文章链接JS数组对象——根据日期进行排序&#xff0c;按照时间进行升序或降序排序https://blog.csdn.net/XSL_HR/article/details/128579840?spm1…

Markdown使用说明

Markdown使用说明欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注…

[网鼎杯 2020 朱雀组]phpweb

目录 信息收集 方法一&#xff1a;in_array()函数绕过 方法二&#xff1a;反序列化漏洞利用 信息收集 抓个包&#xff0c;发现POST传入以下内容 funcdate&pY-m-dh%3Ai%3Asa func和p的值分别为一个待执行的函数和函数的参数 构造payload 尝试funcphpinfo&p 回显 H…

【学习笔记之Linux】权限

权限概念 一件事是否允许被谁“做”&#xff0c;这就是权限。权限 用户 文件属性。   在Linux上&#xff0c;用户分为普通用户和root。root是超级管理员 ≈ 天王老子&#xff0c;只能够有一个。root的命令提示符是#&#xff1b;普通用户通过root创建&#xff0c;可以有多个…

【案例教程】地下水环评(一级)实践技术及Modflow地下水数值模拟

【前沿】地下水数值模拟技术应用与地下水环评报告编制方法实践线上直播课程&#xff0c;主要围绕的环评导则&#xff0c;结合不同行业类别&#xff0c;实例讲解地下水环境影响评价的原则、内容、工作程序、方法。包括数据处理分析、数值模型构建以及环评报告编写等。涉及地下水…

【自学C++】C++ int

C int C int教程 C 中的 int 用来表示一个 整数&#xff0c;也可以叫做整型&#xff0c;int 的取值范围是介于 short 和 long 之间的。 C int定义详解 语法 int varname value;参数 参数描述int定义 int 类型变量使用的类型。varname变量名。value可选&#xff0c;变量的…

Linux应用编程---9.消息队列

Linux应用编程—9.消息队列 ​ 消息队列用于进程之间的通讯&#xff0c;可以在如父子进程、兄弟进程这样的具有亲缘关系的进程之间传递数据&#xff0c;也可以用于具有非亲缘关系的进程之间通讯。消息队列可以传递结构体&#xff0c;所以可以发送任意数据类型。与消息队列有关…

数据结构(一)——链表

链表与邻接表 介绍 链表作为一种基础数据结构&#xff0c;具有几个特点&#xff1a; 优点&#xff1a;插入、删除非常快&#xff08;需要知道需要插入和删除节点前一个位置&#xff09;缺点&#xff1a;查询、访问&#xff08;用索引&#xff09;非常的慢 链表的创建方法一…

Selenium用法详解【cookies操作】【JAVA爬虫】

简介本文主要讲解java代码利用Selenium控制浏览器获取网站的cookies,对网站cookies的相关操作教程。cookies操作cookies 是识别用户登录与否的关键&#xff0c;爬虫中常常使用 selenium jsoup 实现 cookie持久化&#xff0c;即先用 selenium 模拟登陆获取 cookie &#xff0c;…

你可能从未想过的:人工智能未来50年的安全领域问题

前言 随着人工智能技术的普及和发展&#xff0c;很多人工智能出现的故障和问题也会愈发明显。本文简单讲述了未来50年人工智能发展过程中可能会出现的景象和问题。 一、人工智能独立 尽管很可能第一批人工智能是由人类发明制作的&#xff0c;但随着大量基础设施的完善&#x…

javaweb-会话技术CookieSession

文章目录会话技术Cookie&Session1&#xff0c;会话跟踪技术的概述2&#xff0c;Cookie2.1 Cookie的基本使用2.2 Cookie的原理分析2.3 Cookie的使用细节2.3.1 Cookie的存活时间2.3.2 Cookie存储中文3&#xff0c;Session3.1 Session的基本使用3.2 Session的原理分析3.3 Sess…