【Linux】【进程控制】API汇总整理

进程控制是操作系统中一个非常重要的概念,它涉及到创建、管理和终止进程的能力。进程控制包括一系列操作,如创建新进程、等待进程结束、发送信号给进程等。下面是进程控制中一些常见的操作及其相关API:

e8d212b67d804b07b0c6812f2be8c563.jpeg

进程控制概述

进程控制是指操作系统提供的用于管理进程生命周期的功能。这包括创建进程、获取进程状态、等待进程结束、发送信号等操作。这些功能对于编写多进程程序和系统管理工具尤为重要。

进程控制的常见操作

创建进程

  • fork()

    • pid_t fork(void): 创建一个新的进程,该进程是当前进程的一个副本。
    • 返回值:在父进程中返回子进程的PID,在子进程中返回0。
  • vfork()

    • pid_t vfork(void): 类似于fork(),但在子进程中执行完_exit()longjmp()前,父进程会被阻塞。
    • 返回值:同fork()
  • posix_spawn()

    • int posix_spawn(pid_t *pid, const char *path, const posix_spawn_file_actions_t *file_actions, const posix_spawnattr_t *attrp, char *const argv[], char *const envp[]): 创建一个新的进程,执行指定路径的程序。
    • 参数argvenvp分别指定了程序的参数列表和环境变量。
  • exec系列函数

    • execl(const char *path, const char *arg, ...): 替换当前进程映像,执行新的程序。
    • execle(const char *path, const char *arg, ..., char *const envp[]): 替换当前进程映像,执行新的程序,并设置环境变量。
    • execlp(const char *file, const char *arg, ...): 替换当前进程映像,执行新的程序,使用PATH环境变量查找文件。
    • execv(const char *path, char *const argv[]): 替换当前进程映像,执行新的程序。
    • execvp(const char *file, char *const argv[]): 替换当前进程映像,执行新的程序,使用PATH环境变量查找文件。
    • execvpe(const char *file, char *const argv[], char *const envp[]): 替换当前进程映像,执行新的程序,使用PATH环境变量查找文件,并设置环境变量。
    • 返回值:这些函数在失败时返回-1,在成功时则不会返回。

获取进程状态

  • wait()

    • pid_t wait(int *status): 等待任意一个子进程结束,并获取其状态。
    • 参数status可以通过宏如WIFEXITED()WEXITSTATUS()等解析进程的状态。
  • waitpid()

    • pid_t waitpid(pid_t pid, int *status, int options): 等待指定的子进程结束,并获取其状态。
    • 参数pid可以指定等待哪个子进程;options可以指定等待的行为,如WNOHANG表示非阻塞等待。
  • waitid()

    • int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options): 等待一个指定的进程或线程结束,并获取其状态。
    • 参数idtype可以是P_PID(进程ID)、P_PGID(进程组ID)或P_PID(线程ID)。

进程终止

  • _exit()

    • _exit(int status): 使进程正常终止,并给出一个退出状态码。
    • 这个函数是进程终止时使用的,而不是用于线程。
  • exit()

    • void exit(int status): 使进程正常终止,并给出一个退出状态码。
    • 这个函数会先调用注册的终止处理函数。
  • abort()

    • void abort(void): 异常终止进程,并产生一个核心转储文件(如果启用了core dump)。

进程属性

  • getpid()

    • pid_t getpid(void): 获取当前进程的PID。
  • getppid()

    • pid_t getppid(void): 获取当前进程的父进程PID。
  • setsid()

    • pid_t setsid(void): 创建一个新的会话,并使其成为会话领导者。
    • 通常用于创建后台进程。
  • getpgid()

    • pid_t getpgid(pid_t pid): 获取进程组ID。
  • setpgid()

    • int setpgid(pid_t pid, pid_t pgid): 设置进程组ID。

进程资源控制

  • nice()

    • int nice(int inc): 改变进程的调度优先级。
    • inc表示优先级的变化值。
  • setpriority()

    • int setpriority(int which, id_t who, int prio): 改变进程或进程组的优先级。

发送信号

  • kill()

    • int kill(pid_t pid, int sig): 发送信号给指定的进程。
    • 参数sig指定要发送的信号类型。
  • raise()

    • int raise(int sig): 发送信号给当前进程。
    • 参数sig指定要发送的信号类型。

示例代码

以下是一个简单的示例,展示如何在 Linux 系统上使用 C 语言创建子进程、等待子进程结束、并获取子进程的退出状态:

1#include <stdio.h>
2#include <unistd.h>
3#include <sys/wait.h>
4
5int main() {
6    pid_t pid;
7
8    // 创建子进程
9    pid = fork();
10    if (pid < 0) {
11        fprintf(stderr, "fork failed\n");
12        return 1;
13    } else if (pid > 0) {
14        // 父进程
15        int status;
16
17        // 等待子进程结束
18        if (waitpid(pid, &status, 0) != pid) {
19            fprintf(stderr, "waitpid failed\n");
20            return 1;
21        }
22
23        // 检查子进程的退出状态
24        if (WIFEXITED(status)) {
25            printf("子进程正常退出,状态码为 %d\n", WEXITSTATUS(status));
26        } else {
27            printf("子进程异常退出\n");
28        }
29    } else {
30        // 子进程
31        printf("子进程 PID: %d\n", getpid());
32        _exit(0);  // 子进程正常退出
33    }
34
35    return 0;
36}

注意事项

  • 在创建子进程后,务必使用wait()waitpid()等待子进程结束,否则会产生僵尸进程。
  • 使用_exit()来终止子进程,而不要使用exit(),以避免执行不必要的清理工作。
  • 调用fork()之后,父进程和子进程中的程序计数器指向同一位置,因此通常需要立即添加条件分支来区分父进程和子进程的代码路径。
  • 在使用exec系列函数替换进程映像时,如果失败,需要检查错误并采取适当的措施。

进程控制是操作系统中的重要概念,理解这些操作对于编写多进程程序和系统管理工具至关重要。

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

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

相关文章

HTML练习题:彼岸的花(web)

展示效果: 代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>彼岸の花</title><style…

【安全性分析】正式安全分析与非正式安全分析

安全性分析-系列文章目录 第一章 【安全性分析】正式安全分析与非正式安全分析 第二章 【安全性分析】BAN逻辑 (BAN Logic) 文章目录 安全性分析-系列文章目录前言一、正式安全分析1. 理想化模型(如随机预言机模型)2. 标准模型(Standard Model)3. 形式化验证4. 数学证明二…

HTML小阶段二维表和思维导图

下面是对标签、元素、属性的对比二维表&#xff0c;通过对比3w1h&#xff08;what是什么、where用在哪、why为什么要用、how如何用&#xff09;来学习区分学习标签、元素、属性 标签 元素 属性 what &#xff08;Tags&#xff09;标签是用来标记内容块或标明元素内容意义 …

NIO 核心知识总结

在传统的 Java I/O 模型&#xff08;BIO&#xff09;中&#xff0c;I/O 操作是以阻塞的方式进行的。也就是说&#xff0c;当一个线程执行一个 I/O 操作时&#xff0c;它会被阻塞直到操作完成。这种阻塞模型在处理多个并发连接时可能会导致性能瓶颈&#xff0c;因为需要为每个连…

助力风力发电风机设备智能化巡检,基于YOLOv7全系列【tiny/l/x】参数模型开发构建无人机巡检场景下风机叶片缺陷问题智能化检测预警模型

在全球能源转型的大潮中&#xff0c;清洁环境能源的发展已成为各国关注的焦点。风力发电作为其中的佼佼者&#xff0c;以其可再生、无污染的特点&#xff0c;受到了广泛的青睐。然而&#xff0c;风力发电设施大多建于人迹罕至的地区&#xff0c;设备庞大且复杂&#xff0c;其维…

Apache POI(java操作Miscrosoft Office)

Apache POI 1.1 介绍 Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。 一般情况下&#xff0c;POI 都是用于操作 Excel 文件。 Apache POI 的应用场景&a…

C++ | Leetcode C++题解之第537题复数乘法

题目&#xff1a; 题解&#xff1a; class Solution { public:string complexNumberMultiply(string num1, string num2) {regex re("\\|i"); vector<string> complex1(sregex_token_iterator(num1.begin(), num1.end(), re, -1), std::sregex_token_iterator…

Java ==> String类(字符串)

文章目录 一、认识String类1、创建String对象2、不可变的String3、字符串常量池 二、字符串常用操作1、字符串比较1.1 用“”比较1.2 用equals()方法比较1.3用compareTo()方法进行比较 2、获取字符串长度3、字符串查找4、字符串转换4.1valueOf()数值转换为字符串4.2字母大小写转…

Qt中的Model与View 4:QStandardItemModel与QTableView

目录 QStandardItemModel API QTableView 导航 视觉外观 坐标系统 API 样例&#xff1a;解析一个表格txt文件 QStandardItemModel QStandardItemModel 可用作标准 Qt 数据类型的存储库。它是模型/视图类之一&#xff0c;是 Qt 模型/视图框架的一部分。它提供了一种基于…

【SpringMVC】传递json,获取url参数,上传文件

【传递json数据】 【json概念】 一种轻量级数据交互格式&#xff0c;有自己的格式和语法&#xff0c;使用文本表示一个对象或数组的信息&#xff0c;其本质上是字符串&#xff0c;负责在不同的语言中数据传递与交换 json数据以字符串的形式体现 【json字符串与Java对象互转…

Java JUC(四) 自定义线程池实现与原理分析

目录 一. 阻塞队列 BlockingQue 二. 拒绝策略 RejectPolicy 三. 线程池 ThreadPool 四. 模拟运行 在 Java基础&#xff08;二&#xff09; 多线程编程 中&#xff0c;我们简单介绍了线程池 ThreadPoolExecutor 的核心概念与基本使用。在本文中&#xff0c;我们将基于前面学…

go-logger v0.27.0 - 并发性能为官方库 10 倍

go-logger是一个高性能的 golang 日志库&#xff0c;旨在提供快速、轻量级的日志记录功能 Github 使用文档 v0.27.0 更新内容 优化内存分配优化写数据性能增加日志属性自定义函数增加各个日志级别格式化打印函数 说明 性能优化是该版本最重要的更新内容。性能优化的结果&…

【华为HCIP实战课程31(完整版)】中间到中间系统协议IS-IS路由汇总详解,网络工程师

一、IS-IS的汇总 1、可以有效减少在LSP中发布的路由条目,减小对系统资源的占用。 2、会减少LSP报文的扩散,接收到该LSP报文的其他设备路由表中只会出现一条聚合路由。 3、可以避免网络中的路由震荡,提高了网络的稳定性。 4、被聚合的路由可以是IS-IS路由,也可以是被引入…

邮件发送excel带预览excel功能

excel 打开后的内容: 思路&#xff1a; 1、邮件发送excel 是作为附件发送出去的&#xff1b; 2、excel 预览是&#xff0c;必须另外点击预览按钮&#xff0c;并不能直接预览邮件内容然后在邮件主体内容展示出来 根据以上两点基本没法实现 邮件发送后邮件自带 预览功能。 伪方法…

HCIA(DHCP服务)

第三节 开启DHCP服务 创建地址池 调用全局服务 [R1]dhcp enable 开启DHCP服务 [R1]ip pool AA 创建地址池 [R1-ip-pool-AA]network 192.168.1.0 mask 24 写入网段 [R1-ip-pool-AA]gateway-list 192.168.1.1 写入网关 [R1-ip-pool-AA]dns-list 8.8.8.8 114.1…

java项目之文理医院预约挂号系统源码(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的文理医院预约挂号系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息。 项目简介&#xff1a; 本系统的使用角色可…

A4-C四驱高防变电站巡检机器人

在电力行业数字化、智能化转型进程中&#xff0c;搭载多模态成像传感器的变电站巡检机器人、视频监控设备逐渐取代传统人工&#xff0c;成为变电设备状态监测的主要工具。变电站巡检机器人具有全天候、非接触式、多参量测量等特点&#xff0c;结合内置人工智能算法完成仪表识别…

【华为HCIP实战课程三十】中间到中间系统协议IS-IS路由渗透及TAG标识详解,网络工程师

一、路由泄露 1、默认情况Level 1不会学到Level2的明细路由&#xff0c;L2可以学到L1的明细路由 2、FIB数据转发&#xff0c;路由负载&#xff0c;通过随机数据中的五元组hash,hash值决定数据走哪条链路 R1设备ping和telnet通过抓包查看走的都是S1/0/0接口 抓包进行过滤;ip.a…

面向对象三大特征之一:封 装

1、特点 封装是面向对象的核心思想&#xff0c;两层含义&#xff1a;一是一个整体&#xff08;把对象的属性和行为看成一个整体&#xff0c;即封装在一个对象种&#xff09;&#xff0c;二是信息隐藏&#xff0c;对外隐藏&#xff0c;但可以通过某种方式进行调用。 2、访问权…

引领汽车行业未来,3D数字化技术如何改变汽车行业?

新能源汽车行业加速发展&#xff0c;新车型密集发布&#xff0c;汽车保有量和车龄的增加&#xff0c;也同时点燃了汽车后市场的增长引擎。对于车企而言&#xff0c;如何全方面优化汽车从研发、生产、售后到营销的各个环节&#xff0c;以便适应快速变化的市场需求&#xff1f; 1…