当前位置: 首页 > news >正文

10.2 Linux_进程_进程相关函数

创建子进程

函数声明如下:

pid_t fork(void);

返回值:失败返回-1,成功返回两次,子进程获得0(系统分配),父进程获得子进程的pid

注意:fork创建子进程,实际上就是将父进程复制一遍作为子进程,但子进程只执行fork之后的代码,不执行fork之前的代码。这里的"复制"代表了父子进程的空间是独立的,互不影响。

孤儿进程与僵尸进程:

如果父进程先结束,那么子进程变成孤儿进程,最终被init进程收养,并且子进程变为后台进程。

如果子进程先结束,但父进程没有回收子进程,那么子进程变成僵尸进程。

fork基本使用方法:

pid = fork();
if(pid<0){perror("fork");return -1;
}else if(pid == 0){//子进程代码
}else if(pid > 0){//父进程代码
}

创建多个子进程: 

具体代码实现如下:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>int main(){pid_t pid;int i;printf("father pid = %d\n",getpid());for(i=0;i<5;i++){if((pid=fork()) < 0){perror("fork");return -1;}else if(pid == 0){break;//子进程不进行fork}}if(i==5){printf("father pid = %d\n",getpid());}else{printf("child pid = %d\n",getpid());}while(1);return 0;
}

代码执行结果如下: 

进程结束

函数声明如下:

void exit(int status);void _exit(int status);
void _Exit(int status);

exit结束进程后,会刷新缓冲区,其余这三个函数没有区别。

status:返回给系统的状态值

注意:main函数结束会隐式调用exit函数,所以在main函数结束时会刷新缓冲区。

exit刷新缓冲区实验:

进程回收

函数声明如下:

pid_t wait(int *wstatus);
pid_t waitpid(pid_t pid, int *wstatus, int options);

返回值:成功返回回收的子进程的pid,失败返回EOF

wstatus:保存子进程结束的状态,NULL代表直接释放子进程的PCB,不接收返回值。

pid:想要回收的子进程的pid,-1代表任意子进程,0代表进程组中的任意子进程

options:回收的方式

  • 0:阻塞等待子进程结束
  • WNOHANG:不阻塞等待子进程结束,子进程未结束也返回,继续执行下面代码。

注意:父进程调用该函数后一直处于阻塞状态,直到子进程结束

通过宏来解析wstatus:

wstatus中包含了是否正常退出、exit返回值、是否被信号结束、结束进程的信号类型。

解析的宏如下:

含义
WIFEXITED(wstatus)判断子进程是否正常退出
WEXITSTATUS(wstatus)获取子进程返回值,即:exit的值
WIFSIGNALED(wstatus)判断子进程是否被信号结束
WTERMSIG(wstatus)获取结束子进程的信号类型

wait测试代码:

具体代码实现如下:

#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
int main(){pid_t pid;int wstatus;if((pid = fork()) < 0){return -1;}else if(pid == 0){sleep(10);printf("now child exit\n");exit(2);}else{wait(&wstatus);//以阻塞方式等待子进程退出printf("是否正常退出:%d\n",WIFEXITED(wstatus));printf("子进程的返回值为%d\n",WEXITSTATUS(wstatus));printf("子进程是否被信号结束%d\n",WIFSIGNALED(wstatus));printf("结束子进程的信号类型%d\n",WTERMSIG(wstatus));}return 0;
}

代码执行结果如下:

waitpid填写WNOHANG实验:

当子进程退出后,子进程的pid会一直存在,直到被回收。当写入WNOHANG时,waitpid不会进入阻塞。但可以通过循环的模式,一次次判断是否有子进程需要回收。

具体代码实现如下:

#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
int main(){pid_t pid;int wstatus;if((pid = fork()) < 0){return -1;}else if(pid == 0){sleep(5);printf("now child exit\n");exit(2);}else{while(1){if(waitpid(pid,&wstatus,WNOHANG) > 0){ //当子进程退出后,父进程退出whilebreak;}printf("father is running\n");sleep(1);}}return 0;
}

代码执行结果如下:

进程执行其他程序

1、exec

exec函数的作用:

进程调用exec函数执行某个程序,调用后进程的当前内容被指定的程序替换,但进程号不变。

利用exec可以实现父子进程执行不同的程序:创建子进程->子进程调用exec执行其他功能。 

函数声明如下:

int execl(const char *pathname, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execv(const char *pathname, char *const argv[]);
int execvp(const char *file, char *const argv[]);

返回值:失败返回-1

pathname:执行程序的路径

file:执行程序的名字,会从环境变量PATH中寻找该执行程序

arg:执行程序的参数,第0个参数为程序名

argv:执行程序的参数,以字符串数组形式呈现

...:写NULL、0、(char*)0,这三个中的其中一个

示例:使用execl实现 " ls -li . " 的功能

具体代码实现如下:

#include <unistd.h>
#include <stdio.h>int main(){//ls -li . 有三个参数,ls是第0个参数execl("/bin/ls","ls","-li",".",NULL);printf("get\n");return 0;
}

代码运行结果如下:

示例:使用execv实现 " ls -li . " 的功能

具体代码实现如下:

#include <unistd.h>
#include <stdio.h>
#include <errno.h>
int main(){//这里最后一个NULL,不需要加双引号char* a[] = {"ls","-li",".",NULL};if(execv("/bin/ls",a) == -1){perror("execv");}printf("get\n");return 0;
}

代码运行与execl一样

2、system

system的作用:

执行一个指令,调用system后会等待指令执行结束,之后继续执行下面的代码,而不是像exec那样下面的代码被替代。

函数声明如下:

int system(const char *command);

返回值:失败返回EOF

command:一个指令,以字符串形式呈现

示例:使用system实现 " ls -li . " 的功能

具体代码实现如下:

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
int main(){system("ls -li .");printf("get\n");return 0;
}

代码运行结果如下: 

相关文章:

10.2 Linux_进程_进程相关函数

创建子进程 函数声明如下&#xff1a; pid_t fork(void); 返回值&#xff1a;失败返回-1&#xff0c;成功返回两次&#xff0c;子进程获得0(系统分配)&#xff0c;父进程获得子进程的pid 注意&#xff1a;fork创建子进程&#xff0c;实际上就是将父进程复制一遍作为子进程&…...

栈与队列面试题(Java数据结构)

前言&#xff1a; 这里举两个典型的例子&#xff0c;实际上该类型的面试题是不确定的&#xff01; 用栈实现队列&#xff1a; 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 方法一&#xff1a;双栈 思路 将一个栈当作输入栈&#xff0c;用于压入 push 传入的数…...

手撕数据结构 —— 顺序表(C语言讲解)

目录 1.顺序表简介 什么是顺序表 顺序表的分类 2.顺序表的实现 SeqList.h中接口总览 具体实现 顺序表的定义 顺序表的初始化 顺序表的销毁 打印顺序表 ​编辑 检查顺序表的容量 尾插 尾删 ​编辑 头插 头删 查找 在pos位置插入元素 删除pos位置的值 ​…...

女友学习前端第二天-笔记

2024/10/8笔记 表格 table 表格 tr 行 td 单元格内容 th 表头 第一行相当于h1 alignleft /center /right 对齐方式 应在table边上 比如<table alignleft> border 代表边框 也应在table边上 比如<table alignleft border"1"> cellpadding 单元外框与…...

电脑手机下载小米xiaomi redmi刷机包太慢 解决办法

文章目录 修改前下载速度修改后下载速度修改方法&#xff08;修改host&#xff09; 修改前下载速度 一开始笔者以为是迅雷没开会员的问题&#xff0c;在淘宝上买了一个临时会员后下载速度依然最高才100KB/s 修改后下载速度 修改方法&#xff08;修改host&#xff09; host文…...

Python中的策略模式:解锁编程的新维度

引言 策略模式是一种行为型设计模式&#xff0c;允许算法独立于使用它的客户端而变化。这使得我们可以根据不同的情况选择不同的算法或策略来解决问题&#xff0c;从而增强系统的灵活性。在日常开发中&#xff0c;策略模式常用于处理多种算法或行为之间的切换&#xff0c;比如…...

ara::core::Future::then()的概念和使用方法

1. 概念 在ara::core::Future的上下文中&#xff0c;then()是一种用于处理异步操作结果的机制。一个Future代表一个尚未完成的异步计算&#xff0c;它最终会产生一个结果或者一个错误。then()方法允许你在Future完成时注册一个回调函数&#xff08;或者说后续操作&#xff09;…...

九、5 USART串口数据包

数据包作用&#xff1a;把一个个单独的数据给打包起来&#xff0c;将同一批的数据进行打包和分割&#xff0c;方便接收方进行识别&#xff0c;方便我们进行多字节的数据通信。 1、串口收发HEX数据包 &#xff08;1&#xff09;数据包的格式是个人规定的&#xff0c;如以FF为包…...

SQL第12课——联结表

三点&#xff1a;什么是联结&#xff1f;为什么使用联结&#xff1f;如何编写使用联结的select语句 12.1 联结 SQL最强大的功能之一就是能在数据查询的执行中联结&#xff08;join)表。联结是利用SQL的select能执行的最重要的操作。 在使用联结前&#xff0c;需要了解关系表…...

CentOS7 虚拟机操作系统安装及相关配置教程

1、安装虚拟机 在VMware《主页》界面中点击《创建新的虚拟机》按钮&#xff1a; 选择你准备好的ISO文件&#xff0c;点击下一步&#xff1a; 然后填写虚拟机的名称以及虚拟机将来保存的位置&#xff1a; 再次下一步&#xff0c;填写虚拟机磁盘大小&#xff1a; 继续下一步&…...

『网络游戏』窗口基类【06】

创建脚本&#xff1a;WindowRoot.cs 编写脚本&#xff1a; 修改脚本&#xff1a;LoginWnd.cs 修改脚本&#xff1a;LoadingWnd.cs 修改脚本&#xff1a;ResSvc.cs 修改脚本&#xff1a;LoginSys.cs 运行项目 - 功能不变 本章结束...

04_23 种设计模式之《单例模式》

文章目录 一、单例模式基础知识单例模式有 3 个特点&#xff1a; 单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。这种模式通常用于管理共享资源&#xff0c;如…...

视频加字幕用什么软件最快?12款工具快速添加字幕!

对于大多数同学来讲&#xff0c;剪辑中比较头疼的就是如何给视频加字幕和唱词啦&#xff0c;特别是用Pr或者FCXP等专业剪辑软件&#xff0c;加字幕也是特别费时的&#xff0c;哪怕是有批量添加的功能orz... 虽然关于这方面的内容已经很多啦&#xff0c;但是真正全面的内容还特…...

C++:string (用法篇)

文章目录 前言一、string 是什么&#xff1f;二、C语法补充1. auto2. 范围for 三、string类对象的常见构造1. Construct string object2. String destructor3. operator 四、string迭代器相关1. begin与end1&#xff09;begin2&#xff09;end3&#xff09;使用 2. rbegin 与 r…...

力扣随机题

最接近原点的K个点 题目 973. 最接近原点的 K 个点 - 力扣&#xff08;LeetCode&#xff09; 思路 这就是一道排序题&#xff0c;直接根据公式排序&#xff0c;然后返回对应范围的数组就行了 代码 public int[][] kClosest(int[][] points, int k) {Arrays.sort(points, n…...

CSS样式基础样式选择器(案例+代码实现+效果图)

目录 1.css样式的规则 2.引入css样式的方式 1)行内式 2)内嵌式 3)外链式 1-link导入 2-import导入 4)总 3.css基础选择器 1)标签选择器 案例&#xff1a;使用标签选择器编写一个圆 1.代码 2.效果 2)类选择器 案例&#xff1a;使用类选择器为div添加背景色 1.代码 2.效果 3)id…...

Linux系统编程—I/O缓冲区(C语言实现)

I/O缓冲区 进程的I/O缓冲区机制是计算机操作系统中一个重要的概念&#xff0c;它涉及到数据在内存和外设之间的传输。以下是关于进程的I/O缓冲区机制的详细解释&#xff1a; 1.定义与作用 定义&#xff1a;I/O缓冲区是指在内存里开辟的一块区域&#xff0c;用来存放接收用户输…...

MySQL多表查询:行子查询

先看我的表数据 dept表 emp表 行子查询 子查询返回的结果是一行&#xff08;可以是多列&#xff09;, 这种子查询称为行子查询 常用的操作符: , <>, IN, NOT IN 例子1. 查询与“张无忌” 的薪资及直属领导相同的员工信息 拆解成两个问题 a. 查询"张无忌"…...

.NET CORE程序发布IIS后报错误 500.19

发布IIS后浏览时报错误500.19&#xff0c;同时配置文件web.config的路径中也存在问号“?”。 可能原因&#xff1a;没有安装运行时...

Qt 6 相比 Qt 5 的主要提升与更新

自从 Qt 6 发布以来&#xff0c;作为 Qt 框架的一个重大版本更新&#xff0c;它在多个核心方面进行了深度优化和改进。与 Qt 5 相比&#xff0c;Qt 6 不仅提升了性能&#xff0c;还改进了对现代硬件和图形 API 的支持&#xff0c;并增强了开发者的工作流程。本文将详细介绍 Qt …...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...