Linux_进程控制

一:进程创建

fork()函数创建新进程

#include <unistd.h>
pid_t fork(void);
返回值:自进程中返回0,父进程返回子进程id,出错返回-1

进程调用fork,当控制转移到内核中的fork代码后,内核做:

1.为新进程分配一个唯一的进程标识符(PID)。复制父进程的相关信息,创建一个新的进程控制块(PCB)。指向同一块内容

2.内核不会立即复制父进程的整个地址空间,而是标记这些页面为只读,当父进程或子进程尝试写入时会触发系统错误,再由系统判断是野指针问题,还是写时拷贝,如果是写时拷贝,就新开辟空间来拷贝再修改。(为什么不直接修改?因为count++,需要原数据)

再把进行修改的进程的页表更改,并把父子进程权限恢复。(只读->可读写)

3.对父进程而言,fork返回新创建进程的PID;对子进程而言,返回0。

4.新进程加入调度队列.

二:进程终止

退出码作用:

通常,退出码为0表示进程成功执行,而非零值表示错误或异常情况。

不同的非零值可以代表不同类型的错误。(退出码也可以用自己定义的)

echo $? 

查看最近一次进程退出码

char *strerror(int errnum);

用于根据错误码返回对应的错误信息字符串。

进程终止的方式

1.main函数return 

2.exit()

3._exit()

void exit(int status);

函数用于终止进程,并可以返回一个状态码给操作系统。它定义在 <stdlib.h> 头文件中。

#include <stdio.h>
#include <stdlib.h>int main() {printf("Starting the program...\n");// 假设发生了错误if (/* some error condition */ 1) {printf("An error occurred. Exiting the program.\n");exit(1); // 以状态 1 退出}printf("Program completed successfully.\n");exit(0); // 以状态 0 正常退出
}

void _exit(int status);

是一个系统调用,用于立即终止进程,而不执行任何清理工作。它定义在 <unistd.h> 头文件中。

exit和_exit不同

1.exit,退出时会刷新缓冲区,而_exit不会刷新缓冲区.

2.exit:适合在程序正常结束时使用,或者在需要进行资源清理时使用。_exit通常在子进程中使用,特别是在调用 fork 后,如果子进程出现错误或者需要立即终止而不影响父进程的状态时使用。

exit 会在内部调用 _exit 来完成终止进程的操作,但在此之前会执行清理工作。因此,可以认为 exit 是对 _exit 的封装。

三:进程等待

当我们fork创建子进程,等子进程结束后会进入僵尸状态,此时就需要父进程来回收子进程。父进程可以用wait waitpid来回收子进程获取退出信息。

pid_t wait(int *status)

父进程调用wait会阻塞,直到其任一子进程终止。参数status可以用来获取子进程的退出状态。

等待成功返回子进程pid,反之-1,并设置errno

解释:int*status是位图,看低16位,8~15位代表子进程的退出码。0~7退出信号的值。

进程退出情况:

1.代码跑完,结果正确return 0

   代码跑完,结果错误return !0    返回退出码 退出信号为0

2.进程异常,(越界访问 栈溢出)系统用信号提前终止进程。  返回退出信号

进程因接收到信号而终止,它不会返回正常的退出码。

1.获取退出码

WIFEXITED(status) 来检查子进程是否正常退出,

如果子进程正常退出,则可以调用 WEXITSTATUS(status) 来获得退出码。

2.获取退出信息

 WIFSIGNALED(status) 检查子进程是否因信号而终止,

如果子进程是因为信号终止的,可以使用 WTERMSIG(status) 来获取导致终止的信号编号。

pid_t waitpid (pid_t pid, int *status, int options)

pid_t waitpid(pid_t pid, int *status, int options);
1.pid 指定等待子进程的pid,为-1等待任意子进程。为 0,则等待与调用进程相同组的任何子进程。

2.status 输出型参数,带回子进程退出信息

3.options参数可以设定为 0,或者使用一些特定的选项来控制等待行为。

可以while循环重复调用直到子进程结束

  1. WNOHANG

    • 如果没有子进程结束,waitpid 会立即返回,而不是阻塞父进程。
    • 返回值:
      • 若有子进程结束,返回该子进程的 PID。
      • 若没有子进程结束,返回 0。

返回值:

1.成功时,返回子进程的进程ID。

2.子进程没有结束,返回0。

3.出错时,返回 -1,且设置 errno

四:进程替换

用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。

execl

int execl(const char *path, const char *arg0, ..., (char *) NULL);

execl是系统调用,是用新程序替换当前进程的映像。
path要执行程序的路径    

arg0 arg1 ... 执行方法 

最后以NULL结尾

eg. exel("bin/ls","ls","-l",nullptr);

1.execl是替换进程,并不是新建进程。

2.execl成功不返回 失败返回-1

execv

execv(const char *path, char *const argv[]);

和execl不同的是path后面不是可变参数列表,而是指针数组。

execle

execle(const char *path, const char *arg0, ..., NULL, char *const envp[]);

和execl一致,但可以传环境变量

execve

execve(const char *path, char *const argv[], char *const envp[]);

最底层的版本,允许传递参数和环境变量。

execlp 和 execvp

execlp(const char *file, const char *arg0, ..., NULL);

execvp(const char *file, char *const argv[]);

不同的是它可以在环境变量(PATH)的默认路径下查找

eg. execlp("ls", "ls", "-l", NULL); // 在 PATH 中查找 ls

execlpe 和 execvpe

int execvpe(const char *file, char *const argv[], char *const envp[]);
int execlpe(const char *file, const char *arg0, ..., NULL, char *const envp[]);
在execlp execvp基础上可以指定特定的环境变量

envp[]环境变量数组,以 NULL 结尾。如果传递 NULL,则使用当前进程的环境变量。

putenv 新增环境变量

#include <stdlib.h>int putenv(char *string);
  • 成功时返回 0。
  • 失败时返回 -1,并设置 errno。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/56749.shtml

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

相关文章

Spring Boot Web框架:智慧社区设计新思路

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

cocos Creator + fairyGUI 快速入门

版本 Creator 3.8.x&#xff0c;FairyGUI 2022 大部分内容来自 https://en.fairygui.com/docs/sdk/creator 1.新建cocos项目&#xff0c;根目录运行 npm install --save fairygui-cc 引入 fairyGUI库 2.assets目录之外新建fairyGUI项目 3.fairyGUI中编辑UI 完成后发布到Creato…

uniapp,获取头部高度

头部自定义时候&#xff0c;设置获取安全区域&#xff0c;可以用 uni.getSystemInfoSync();接口。 <view class"statusBar" :style"{height:statusBarHeightpx}"> let SYSuni.getSystemInfoSync(); let statusBarHeightref(SYS.statusBarHeight) …

SAP_FI_学习树状图

SAP FI学习 │ ├── SAP FI基础知识 │ ├── SAP FI概述 │ ├── 财务会计的基本概念 │ └── SAP FI的主要功能 │ ├── 核心组件 │ ├── 会计凭证处理 │ │ ├── 凭证类型 │ │ ├── 借贷记账 │ │ └── 凭证审核流程 │ ├──…

Python基础——类与对象

类与对象的理解&#xff1a; 在程序中我们将类看作是设计图纸&#xff0c;对象则是根据这个图纸生产的产品。面向对象编程就是使用对象编程&#xff0c;在类中我们定义成员属性和方法。 来看下面这个例子&#xff0c;创建student类&#xff0c;定义对象并对属性赋值。 class S…

解决linux服务器磁盘占满问题(详细,有效,100%解决)

应用场景&#xff1a; 在我们的日常开发中&#xff0c;我们的服务器总是在不知不觉中磁盘莫名奇妙少了很多空间&#xff0c;或者被占满了&#xff0c;如果这时候要想要存储什么文件&#xff0c;突然发现空间不够了。但我们通常也不知道那些文件占用的空间大&#xff0c;这时候…

Vue是一套构建用户界面的渐进式框架,常用于构建单页面应用

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

红黑树的理解与实现(详解)

相关的数据结构&#xff1a; 搜索二叉树-CSDN博客 AVL树的创建与检测-CSDN博客 个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;游戏、数据结构、c语言基础、c学习、算法 目录 一、红黑树规则&#xff1a; 二、红黑树的插入 1.变色 2.单旋变色 3.双旋变色 三、…

WebGoat SQL Injection (intro) 源码分析

首先了解 java 中 mysql 的连接&#xff1a;java连接Mysql WebGoat SQL Injection (intro) 10 根据提示&#xff1a;下面两个输入框只有一个受到 sql 注入攻击。题目要求是检索到所有数据 发现请求路径为 SqlInjection/assignment5b 定位到所在文件如下&#xff0c;根据代码…

电影评论网站开发:Spring Boot技术详解

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了电影评论网站的开发全过程。通过分析电影评论网站管理的不足&#xff0c;创建了一个计算机管理电影评论网站的方案。文章介绍了电影评论网站的系统分析部分&…

【uniapp】使用Promise封装request

目录 1、创建config目录 2、创建settings.js 3、创建目录utils 4、创建request.js 5、创建api目录 6、创建apis.js文件 7、业务系统调用 7.1 业务系统banner 7.2 业务系统荣誉页面&#xff08;传参&#xff09; 前言&#xff1a;使用Promise封装request 1、创建config…

Python实现火柴人的设计与实现

1.引言 火柴人&#xff08;Stick Figure&#xff09;是一种极简风格的图形&#xff0c;通常由简单的线段和圆圈组成&#xff0c;却能生动地表达人物的姿态和动作。火柴人不仅广泛应用于动画、漫画和涂鸦中&#xff0c;还可以作为图形学、人工智能等领域的教学和研究工具。本文…

前端学习---(1)HTML

一个后端狗, 在公司悄摸得学习前端技术 在公司上班时间看视频影响不太好 按照这个来吧: https://gitee.com/chinese-gitee/Web 前端基础要学: HTML, CSS,JS 浏览器 浏览器中最重要的是渲染引擎(浏览器内核),JS引擎(常见的V8引擎) 渲染引擎: 用来解析 HTML与CSS。渲染引擎决定了…

UNIX网络编程-传输层

概述 传输层主要包括&#xff1a;TCP、UDP、SCTP&#xff08;流控制传输协议&#xff09;&#xff01; 绝大多数客户端/服务器网络应用都使用TCP/UDP。SCTP是一个较新的协议&#xff0c;最初设计用于跨因特网传输电话信令。 这些传输协议都转而使用网络协议IP&#xff1a;或是…

2023年华为杯数学建模竞赛题F论文和代码

强对流降水临近预报建模与优化 对问题一&#xff0c;为了实现基于前一小时&#xff08;10帧&#xff09;的实测雷达观测量&#xff08;ZH、ZDR、KDP&#xff09;&#xff0c;对后续一小时&#xff08;10帧&#xff09;的ZH进行预报&#xff0c;本文首先建立了线性拟合与RMSE双驱…

matlab相位图

% 清空工作空间和命令窗口 clear; clc; % 模拟生成时间t&#xff0c;位移y(t)和角位移theta(t) t linspace(0, 100, 1000); % 时间从0到100&#xff0c;包含1000个点 y 1e-5 * sin(2 * pi * 0.1 * t) .* exp(-0.01 * t); % 位移y(t) 振荡衰减 theta 1e-6 * cos(2 * pi * …

第11章 索引(postgresql v17)

V17 Chapter 11. Indexes 索引是增强数据库性能的常用方法。索引允许数据库服务器查找和检索特定的行&#xff0c;比没有索引要快得多。但是索引也会给整个数据库系统增加开销&#xff0c;因此应该合理使用索引。 1、介绍 假设我们有一个类似这样的表: CREATE TABLE test1 …

验证archive_command配置是否正确

要验证 archive_command 配置是否正确&#xff0c;你可以按照以下步骤进行&#xff1a; ‌检查配置文件‌&#xff1a; 确保 postgresql.conf&#xff08;或你的 PostgreSQL 实例使用的任何自定义配置文件&#xff09;中的 archive_command 已经设置为你想要的命令。 ‌重启 …

Python 网络编程:端口检测与IP解析

Python 网络编程&#xff1a;端口检测与IP解析 在现代网络编程中&#xff0c;了解如何检查端口状态以及根据IP地址解析主机名是非常重要的技能。本文将介绍如何使用Python实现这两个功能&#xff0c;并提供相应的示例代码供读者参考。 一、检查端口是否打开 在网络应用中&am…

self.browser = web.WebView.New(self) NotImplementedError

这个错误是 NotImplementedError&#xff0c;通常意味着你正在调用的某个功能在当前环境或库版本中还没有实现或不支持。在这个错误中&#xff0c;问题出在 web.WebView.New(self)&#xff0c;它尝试创建一个 Web 浏览器控件&#xff0c;但未能成功。 在 wxPython 中&#xff…