【Linux学习】进程基础API
下面是有关进程基础API的相关介绍,希望对你有所帮助!
小海编程心语录-CSDN博客
目录
1. 僵尸进程与孤儿进程
1.1 孤儿进程
1.2 僵尸进程
2. 监视子进程
2.1 wait()
2.2 waitpid()
3. 执行新程序
exec族函数
4. 守护进程
1. 僵尸进程与孤儿进程
1.1 孤儿进程
父进程先于子进程结束,此时子进程变成了一个“孤儿”我们把这种进程就称为孤儿进程。
在 Linux 系统当中,所有的孤儿进程都自动成为 init 进程的子进程
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{// 创建子进程 switch (fork()){case -1:perror("fork error");exit(-1);case 0:// 子进程 printf("子进程<%d>被创建, 父进程<%d>\n", getpid(), getppid());sleep(3); // 休眠 3 秒钟等父进程结束printf("父进程<%d>\n", getppid()); // 再次获取父进程 pid_exit(0);default:// 父进程 break;}sleep(1); // 父进程休眠休眠 1 秒,保证子进程能够打印出第一个 printf()printf("父进程结束!\n");exit(0);
}
代码运行结果

1.2 僵尸进程
如果子进程先于父进程退出,同时父进程太忙了,无瑕回收子进程的内存资源,那么此时子进程就变成了一个 僵尸进程,僵尸一词指的是子进程结束后其父进程并没有来得及立马给它“收尸”,子进程处于“曝尸荒野”的状态
回收进程有以下几种情况:
- 如果父进程调用wait()为子进程收尸"后,僵尸进程就会被内核彻底删除。
- 如果父进程并没有调用wait()函数然后就退出了,那么此时init进程将会接管它的子进程并自动调用wait(),故而从系统中移除僵尸进程
- 如果父进程创建了某一子进程,子进程已经结束,而父进程还在正常运行,但父进程并未调用wait()回收子进程,此时子进程变成一个僵尸进程
如果系统中存在大量的僵尸进程,它们势必会填满内核进程表,从而阻碍新进程的创建,所以,在我们的一个程序设计中,一定要监视子进程的状态变化,如果子进程终止了,要调用wait()将其回收,避免僵尸进程。
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{// 创建子进程 switch (fork()){case -1:perror("fork error");exit(-1);case 0:// 子进程 printf("子进程<%d>父进程<%d>\n", getpid(), getppid());sleep(1); // 休眠 1秒钟printf("子进程结束!\n");_exit(0);default:// 父进程 break;}while(1)sleep(1);exit(0);
}
代码运行结果

2. 监视子进程
在很多应用程序的设计中,父进程需要知道子进程于何时被终止,并且需要知道子进程的终止状态信息,是正常终止、还是异常终止亦或者被信号终止等,意味着父进程会对子进程进行监视,同时还需要回收僵尸进程的资源
2.1 wait()
系统调用 wait() 可以等待进程的任一子进程终止,同时获取子进程的终止状态信息
//函数原型
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
函数参数和返回值含义如下:
status:参数 status 用于存放子进程终止时的状态信息,参数 status 可以为 NULL,表示不接收子进程 终止时的状态信息。
返回值:若成功则返回终止的子进程对应的进程号;失败则返回-1。
参数 status 不为 NULL 的情况下,则 wait() 会将子进程的终止时的状态信息存储在它指向的 int 变量中,可以通过以下宏来检查 status 参数:

示例代码
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>int main()
{int status;pid_t pid;int i;int ret;for(i = 1; i<4; i++){pid = fork();switch(pid){case -1:perror("fork error");exit(-1);case 0:// 子进程 printf("子进程<%d>被创建\n", getpid());sleep(i); _exit(i);default:// 父进程 break;}}sleep(1);for(i = 1; i<4; i++){ret = wait(&status);if(ret == -1){if(ECHILD == errno){printf("没有等待回收的进程\n");exit(0);}else{perror("wait error");exit(-1);}}printf("回收的子进程id: %d,回收状态:%d\n", ret, WIFSIGNALED(status));}exit(0);
}
代码运行结果

2.2 waitpid()
使用 wait()系统调用存在着一些限制,这些限制包括如下:
如果父进程创建了多个子进程,使用 wait()将无法等待某个特定的子进程的完成,只能按照顺序等待下一个子进程的终止,一个一个来、谁先终止就先处理谁。
如果子进程没有终止,正在运行,那么 wait() 总是保持阻塞,有时我们希望执行非阻塞等待,而waitpid()函数则可以突破这些限制。
//函数原型
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options);

status: 与 wait()函数的 status 参数意义相同
返回值: 返回值与 wait()函数的返回值意义基本相同
3. 执行新程序
当子进程的工作不再是运行父进程的代码段,而是运行另一个新程序的代码,那么这个时候子进程可以通过 exec 函数来实现运行另一个新的程序。
exec族函数
exec 族函数包括多个不同的函数,这些函数命名都以 exec 为前缀,这些库函数都是基于系统调用 execve() 而实现的,虽然参数各异、但功能相同, 包括: execl()、 execlp()、 execle()、 execv()、 execvp()、 execvpe()
示例代码
// child.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h> int main(int argc, char **argv)
{// 倒数 n 秒for(int i=atoi(argv[1]); i>0; i--){printf("%d\n", i);sleep(1);}// 程序退出,返回 nexit(atoi(argv[1]));
}
// father.c
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h> int main()
{// 子进程if(fork() == 0){printf("加载新程序之前的代码\n");// 加载新程序,并传递参数3execl("./child", "./child", "3", NULL);printf("加载新程序之后的代码\n");}// 父进程else{// 等待子进程的退出int status;int ret = waitpid(-1, &status, 0);if(ret > 0){if(WIFEXITED(status))printf("[%d]: 子进程[%d]的退出值是:%d\n",getpid(), ret, WEXITSTATUS(status));}else{printf("暂无僵尸子进程\n");}}
}
代码运行结果

- 注意:子进程中加载新程序之后的代码无法运行,因为已经被覆盖了。
4. 守护进程
守护进程(Daemon) 也称为精灵进程,是运行在后台的一种特殊进程,它独立于控制终端并且周期性 地执行某种任务。
输入终端命令 ps -aux ,TTY 一栏是 ?表示该进程没有控制终端,也就是守护进程,其中 COMMAND 一栏使用中括号[]括 起来的表示内核线程,这些线程是在内核里创建,没有用户空间代码,因此没有程序文件名和命令行,通常 采用 k 开头的名字,表示 Kernel

如果喜欢请不吝给予三连支持!
小海编程心语录-CSDN博客
相关文章:
【Linux学习】进程基础API
下面是有关进程基础API的相关介绍,希望对你有所帮助! 小海编程心语录-CSDN博客 目录 1. 僵尸进程与孤儿进程 1.1 孤儿进程 1.2 僵尸进程 2. 监视子进程 2.1 wait() 2.2 waitpid() 3. 执行新程序 exec族函数 4. 守护进程 1. 僵尸进程与孤儿进程…...
音视频及H264/H256编码相关原理
一、音视频封装格式原理: 我们播放的视频文件一般都是用一种封装格式封装起来的,封装格式的作用是什么呢?一般视频文件里不光有视频,还有音频,封装格式的作用就是把视频和音频打包起来。 所以我们先要解封装格式&#…...
查看cpu进程数
import multiprocessing from multiprocessing import Pool# 导入 Pool 允许你创建一个进程池 # 进程池是一组工作进程,它们可以并行地执行多个任务# multiprocessing.cpu_count(): 返回当前机器上的CPU核心数 sum_cpu multiprocessing.cpu_count()use_cpu max(1,…...
MySQL优化篇
文章目录 库表结构优化1.规范和反规范化2.数据类型选择3.主键类型选择 索引优化聚簇索引和辅助索引(一切的起源)复合索引 查询优化 库表结构优化 1.规范和反规范化 表设计之间性能和数据完整性,耦合和解耦合之间的取舍。 进而考虑是要冗余…...
Python3 笔记:部分专有名词解释
1、python 英 /ˈpaɪθən/ 这个词在英文中的意思是蟒蛇。但据说Python的创始人Guido van Rossum(吉多范罗苏姆)选择Python这个名字的原因与蟒蛇毫无关系,只是因为他是“蒙提派森飞行马戏团(Monty Python's Flying Ci…...
javaAPI文档中文版(JDK11在线版)java帮助文档,掌握文档java学习事半功倍。
🌠个人主页 : 赶路人- - 🌌个人格言 : 要努力成为梧桐,让喜鹊在这里栖息。 要努力成为大海,让百川在这里聚积。 11.by,prep.凭,靠,沿 [baɪ] 12.press,v.按,压 [prɛs] 菜鸟教程javaAPI文档中文…...
移动端适配:vw适配方案
vw (Viewport Width) 是一种长度单位,代表视口宽度的百分比。1vw 等于视口宽度的1%。在网页设计和前端开发中,vw 单位常用于实现响应式设计和屏幕适配,尤其是针对不同尺寸和分辨率的移动设备。 为什么使用vw适配? 响应式: 使用v…...
实战Java虚拟机-实战篇
一、内存调优 1.内存溢出和内存泄漏 内存泄漏(memory leak):在Java中如果不再使用一个对象,但是该对象依然在GC ROOT的引用链上,这个对象就不会被垃圾回收器回收,这种情况就称之为内存泄漏。内存泄漏绝大…...
力扣:349. 两个数组的交集
349. 两个数组的交集 给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入:nums1 [1,2,2,1], nums2 [2,2] 输出:[2]示例 2: …...
深度学习之基于Matlab的BP神经网络交通标志识别
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 随着智能交通系统(ITS)的快速发展,交通标志识别࿰…...
Linux备份服务及rsync企业备份架构(应用场景)
备份服务概述 备份服务:需要使用到脚本,打包备份,定时任务. 备份服务:rsyncd服务,不同主机之间数据传输. 特点: rsync是个服务也是命令使用方便,具有多种模式传输数据的时候是增量传输 增量与全量: 全量 :无论多少数据全部推…...
用手机打印需要下载什么软件
在快节奏的现代生活中,打印需求无处不在,无论是工作文件、学习资料还是生活小贴士,都可能需要一纸呈现。然而,传统的打印方式往往受限于时间和地点,让人倍感不便。今天,就为大家推荐一款便捷又省钱的手机打…...
Storm在Java中的应用
Storm在Java中的应用主要体现在构建分布式实时计算系统,用于处理大数据流。以下是一些Storm在Java中的具体应用场景和步骤: 实时数据处理:Storm可以实时地接收、处理和传输数据。对于需要快速响应的应用场景,如在线广告、金融交易…...
Java 面试题日常练习
### 基础知识 1. **什么是 JVM?解释其架构。** - JVM(Java Virtual Machine)是 Java 程序的运行时环境。其架构包括类加载器子系统、运行时数据区(堆、栈、本地方法栈、PC 寄存器、方法区)、执行引擎和本地方法接口…...
卷爆短剧出海:五大关键,由AIGC重构
短剧高温下,谈谈AIGC的助攻路线。 短剧,一个席卷全球的高温赛道。 以往只是踏着霸总题材,如今,内容循着精品化、IP化的自然发展风向,给内容、制作、平台等产业全链都带来新机,也让短剧消费走向文化深处&am…...
LLM实战:当网页爬虫集成gpt3.5
1. 背景 最近本qiang~关注了一个开源项目Scrapegraph-ai,是关于网页爬虫结合LLM的项目,所以想一探究竟,毕竟当下及未来,LLM终将替代以往的方方面面。 这篇文章主要介绍下该项目,并基于此项目实现一个demo页面&#x…...
Flutter底部导航栏和顶部Tab切换完整代码
题记 —— 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天。 目前市场上绝大部分App的布局结构基本统一:底部导航顶部导航,底部导航页里嵌套顶部导航栏,顶部导航页里嵌套图文…...
Jupyter 使用手册: 探索交互式计算的无限可能
什么是 Jupyter? Jupyter 是一个开源的 Web 应用程序,可用于创建和共享包含实时代码、可视化和叙述性文本的文档。它最初是作为 IPython 项目的一部分开发的,后来发展成为支持多种编程语言的交互式计算环境。 应用场景 作为一个开源的交互式计算环境,Jupyter 在以下几个领域…...
IP地址显示“不安全”怎么办|已解决
解决IP地址显示“不安全”的问题,通常需要确保网站或服务使用HTTPS协议进行加密通信,可以通过部署SSL证书来解决,以下是具体的解决步骤: 1 申请IP地址SSL证书:网站管理员应向证书颁发机构(CA)申…...
国内安全实用的图纸透明加密软件厂家,靠谱的透明加密软件供应商--安秉信息
设计类图纸安全已经成为企业需要注意的问题,在当前互联网设计行业、汽车制造设计、机械制造行业等相关企业都需要对企业内部图纸的保护需求,现在在互联网中,企业数据泄露的事情已经层出不穷,企业对核心图纸的数据安全工作需要重点…...
LeetCode 二叉搜索树双神题通关!有序数组转平衡 BST + 验证 BST,小白递归一把梭
前言 二叉搜索树(BST)是算法刷题的高频必考知识点!今天给大家带来两道最经典、最基础的 BST 题目,全程用最简单的递归实现,代码干净、思路直白,不用死记硬背,看完就能直接写! 一道教…...
《SpringBoot》EasyExcel实现百万数据的导入导出
在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...
嵌入式开发高效数据结构:queue.h解析与应用
1. 嵌入式开发中的数据结构利器:queue.h深度解析在嵌入式开发的江湖里,数据结构的选择往往决定了程序的效率和稳定性。今天我要分享的是一个被很多开发者忽视的"神兵利器"——queue.h头文件。这个来自FreeBSD和Linux系统的头文件,通…...
VL53L1X ToF测距传感器嵌入式驱动开发全指南
1. VL53L1X 距离传感器驱动库深度解析与嵌入式工程实践VL53L1X 是意法半导体(STMicroelectronics)基于飞行时间(Time-of-Flight, ToF)原理推出的高精度、单点激光测距传感器。其核心优势在于:在 40mm–4000mm 典型量程…...
计算机毕业设计:Python汽车销量大数据预测平台 Flask框架 可视化 机器学习 AI 大模型 大数据(建议收藏)✅
博主介绍:✌全网粉丝50W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战8年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...
10:2026 AI变现实战总览:内容、工具、信息差三种变现闭环
作者: HOS(安全风信子) 日期: 2026-04-01 主要来源平台: GitHub 摘要: 提前剧透12大模块如何串联成3条可复制的赚钱路径。本文构建内容变现2.0闭环全图(Agentic生成)、工具/SaaS变现闭环全图(Ag…...
Blender场景教程:秘密实验室
BY:Express the Chaos关于我做了5年视觉设计师,但没有正式的3D背景。我十一个月前养成了通过概念艺术和3D表达自己的习惯,不得不向Blender介绍自己(因为它是免费软件,我忍不住要用),以及制作3D场景的整个机…...
考研408计算机学科专业基础——计算机组成原理复习
考研408计算机学科专业基础——计算机组成原理复习 核心说明:本笔记聚焦考研408计算机组成原理(计组)高频考点、必背知识点,贴合命题规律(选择大题),剔除冗余内容,突出重难点&#x…...
DownKyi:三分钟学会B站视频下载的终极解决方案
DownKyi:三分钟学会B站视频下载的终极解决方案 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等)。…...
测试计划详细说明
一份高质量的测试计划本质上是质量风险的防御蓝图,它要在有限资源和无限质量诉求之间找到平衡点。我将从结构、内容、决策逻辑三个维度展开,并提供一个可直接落地的框架。一、测试计划的核心定位测试计划的本质回答三个问题:测什么࿱…...
