1. 进程创建

       #include <sys/types.h>#include <unistd.h>pid_t fork(void);

        fork   创建一个新进程

        fork()  creates  a  new process by duplicating the calling process.  The new process is referred to as the child process.  The  calling  process  is  referred to as the parent process.

   fork() 通过复制调用进程来创建一个新进程。新创建的进程称为子进程,而调用进程称为父进程。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>int main() {pid_t pid = fork();if (pid == 0) {/*在父进程中,子进程的pid==0getpid() 获取进程id*/printf("子进程 PID: %d\n", getpid());} else {// 父进程pid 大于0printf("父进程 PID: %d\n", getpid());}return 0;
}

                The  child process and the parent process run in separate memory spaces.  At
the time of fork() both memory spaces have the same content.  Memory writes,
file  mappings (mmap(2)), and unmappings (munmap(2)) performed by one of the
processes do not affect the other.
子进程和父进程运行在独立的内存空间中。调用fork()时,两者的内存空间内容完全一致。任一进程对内存的写入、文件映射(mmap(2))或解除映射(munmap(2))操作均不会影响另一进程。

#include <unistd.h>
#include <stdio.h>int main() {int val = 10;pid_t pid = fork();if (pid == 0) {val = 20;  // 子进程修改不影响父进程printf("Child val: %d\n", val);} else {printf("Parent val: %d\n", val);  // 输出仍为10}return 0;
}

2. 僵尸进程

        僵尸进程(Zombie Process)是指已经完成执行(通过exit()系统调用终止)但其退出状态尚未被父进程读取(通过wait()waitpid()系统调用)的进程。

        产生原因:父进程还存在,但是去做的别的事情了(比如在一个死循环,没有退出),此时子进程退出之后,就变成了僵尸进程。

(可以用ps -ef 查看,进程的状态栏为defunct,这就是所谓的“僵尸”进程)

3. 孤儿进程

        孤儿进程指父进程终止或退出后仍在运行的子进程。这类进程会被系统内核的init进程(PID 为 1)接管,最终由init负责回收资源。

        产生原因:父进程比子进程先结束。

4.  wait  waitpid

        wait, waitpid - 回收进程

       #include <sys/types.h>#include <sys/wait.h>pid_t wait(int *wstatus);pid_t waitpid(pid_t pid, int *wstatus, int options);

         int *wstatus  状态

        退出状态

        父进程监听子进程退出状态,如果正常退出,则输出OK

        如果子进程异常,退出则输出error

         exit(-2)返回给父进程子进程退出状态

         wait(&state);

         waitpid(-1,&state,WNOHANG );

         status == 0 正常退出

         status != 0 异常退出

int options

        WNOHANG     return immediately if no child has exited.

       WUNTRACED   also  return  if  a  child  has  stopped  (but  not  traced  via
ptrace(2)).  Status for traced children which  have  stopped  is
provided even if this option is not specified.

       WCONTINUED (since Linux 2.6.10)
also  return  if a stopped child has been resumed by delivery of
SIGCONT.

WNOHANG

立即返回,若没有子进程退出。

               当返回值ret>0的时候表示子进程退出

               当返回值ret=0的时候表示等待子进程的退出

WUNTRACED

若子进程停止(但未被ptrace(2)跟踪),也返回状态。对于被跟踪且停止的子进程,即使未指定此选项,仍会提供其状态信息。

WCONTINUED(自Linux 2.6.10起)

若停止的子进程因收到SIGCONT信号而恢复执行,也返回状态。

wait 阻塞等待回收进程

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main(int argc, char const *argv[])
{printf("hello wprld\n");pid_t id = fork();if (id == -1){printf("fork fail\n");}else if (id > 0){printf("[%d]我是父进程\n", getpid());wait(NULL);    //等待子进程执行完毕后再往下执行,阻塞等待回收,循环扫描子进程printf("子进程已回收 结束\n");}else{int count = 10;while (count--){printf("[%d]我子进程%d\n", getpid(), count);sleep(1);}}return 0;
}

waitpid  非阻塞等待回收

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main(int argc, char const *argv[])
{printf("hello wprld\n");pid_t id = fork();if (id == -1){printf("fork fail\n");}else if (id > 0){while(1){int ret = waitpid(-1, NULL, WNOHANG);printf("ret=%d\n", ret);if (ret < 0)break;sleep(1);}//等价//while(waitpid(-1,NULL,WNOHANG)==0);   }else{int count = 10;while (count--){printf("[%d]我子进程%d\n", getpid(), count);sleep(1);}}return 0;
}

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

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

相关文章

学习python第12天

今日任务&#xff1a;DataFrameDataFrame的构造pandas.DataFrame(dataNone, indexNone, columnsNone, dtypeNone, copyFalse)参数说明&#xff1a;data&#xff1a;DataFrame 的数据部分&#xff0c;可以是字典、二维数组、Series、DataFrame 或其他可转换为 DataFrame 的对象。…

C++显示类型转换运算符static_cast使用指南

这是一篇关于 static_cast 用法的文章。本文会从基础概念到常见应用场景全覆盖&#xff0c;并附上代码示例以方便理解。C 中的 static_cast 用法详解 在 C 中&#xff0c;static_cast 是一种显式类型转换运算符&#xff0c;主要用于在编译期进行类型安全的转换。相比 C 风格的强…

es6常用方法来解决功能需求

前言&#xff1a;es6常用方法来解决功能需求。1、出现复杂的json字符串如何去解析&#xff1f;比如&#xff1a;下面这个字符串&#xff0c;如果用json.parse解析发现还是个字符串"\"[{\\\"orgId\\\":\\\"1054021138280960\\\",\\\"orgName…

龙虎榜——20250822

上证指数今天继续创新高收中阳线&#xff0c;量能维持在5天均量线附近&#xff0c;目前均线多头强势的走势&#xff0c;小级别也未出现反转信号&#xff0c;上涨趋势不要轻易看空。深证指数今天延续强势的走势&#xff0c;大涨收光头光脚的阳线&#xff0c;目前均线多头排列&am…

3维模型导入到3Dmax中的修改色彩简单用法----第二讲

目录回顾1 补充信息*stp导出没有颜色怎么办&#xff1f;*2 3Dmax的使用如果颜色丢失了怎么办呢&#xff1f;怎么实现一零件上多个色彩呢&#xff1f;怎么将零件绑到一起呢&#xff1f;怎么将三角形的面变成光滑曲面呢&#xff1f;回顾 上一讲&#xff0c;我们简单的说了一下&a…

智慧农业新基建:边缘计算网关在精准农业中的落地实践案例

智慧农业新基建&#xff1a;边缘计算网关在精准农业中的落地实践案例传统农业生产中&#xff0c;水肥管理依赖经验判断&#xff0c;往往造成资源浪费和产量不稳定&#xff1b;同时&#xff0c;恶劣的自然环境也给农业生产带来诸多挑战。而蓝蜂边缘计算网关在精准农业中的应用&a…

llm操控solidworks 画立方体 deepseek

deepseek接入solidowrks画立方体用eval方法链接llm和solidworks pythonwin32接口 离好的效果还差一个有脑子会生成复杂命令序列的ai 参考 基于Python的Solidworks二次开发方法_selectbyray-CSDN博客 Welcome - 2025 - SOLIDWORKS API Help 仓库 llm_sw: llm链接solidworks…

MySQL事务及原理详解

MySQL 事务 事务是一组不可分割的操作集合&#xff0c;这些操作要么同时成功提交&#xff0c;要么同时失败回滚。 acid事物的四大特性 原子性 最小工作单元&#xff0c;要么同时成功&#xff0c;要么同时失败。 例如A转账300给B,A账户-300与B账户300必须满足操作原子性&#xf…

Flutter上手记:为什么我的按钮能同时在iOS和Android上跳舞?[特殊字符][特殊字符]

文章目录&#x1f525; 先解决灵魂拷问&#xff1a;凭啥选Flutter&#xff1f;&#x1f9f1; 解剖Flutter&#xff1a;它肚子里藏着什么黑科技&#xff1f;三层蛋糕架构 &#x1f382;状态管理&#xff1f;江湖门派大战&#xff01; &#x1f94b;&#x1f6e0; 真实项目暴击&a…

单片 、物联网、51单片机、软硬件之基于STM32与蓝牙的仓储管控系统的设计与实现/基于物联网的仓库管理系统

单片 、物联网、51单片机、软硬件之基于STM32与蓝牙的仓储管控系统的设计与实现/基于物联网的仓库管理系统

Product Hunt 每日热榜 | 2025-08-22

1. Mocke 标语&#xff1a;模拟邮件营销&#xff1a;在不发起活动的情况下了解你的回复率 介绍&#xff1a;Mocke AI代理模拟运行电子邮件营销活动&#xff0c;并在一分钟内返回结果&#xff0c;包括邮件的打开率、回复率和退订率。它还会揭示每个潜在客户为何未打开邮件、报…

基于Java+SpringBoot+Vue+HTML5电影评论网站系统(源码+LW+调试文档+讲解等)/电影评论/网站系统/电影/评论/网站/系统/影评网站/电影网站/评论系统/电影评论系统

博主介绍 &#x1f497;博主介绍&#xff1a;✌全栈领域优质创作者&#xff0c;专注于Java、小程序、Python技术领域和计算机毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2025-2026年最新1000个热门Java毕业设计选题…

家用电器,让现代家庭生活更美好

在现代家庭中&#xff0c;家用电器早已不再是冰冷的机器&#xff0c;而是成为了我们生活中不可或缺的一部分。它们以科技之名&#xff0c;融入我们的日常&#xff0c;让生活变得更加便捷、舒适和美好。 清晨&#xff0c;当第一缕阳光透过窗帘&#xff0c;智能咖啡机已经为您准备…

RabbitMQ延时队列的两种实现方式

目录 一、延时插件实现 1、版本要求 2、为运行新容器时安装 3、为已运行的容器安装 4、验证安装 5、代码编写 1. 配置类 2. 生产者 3. 消费者 二、死信队列实现 1、代码编写 1. 配置类 2. 生产者 3. 消费者 三、踩坑记录 1、发送消息失败 2、消息过期后未能转…

深度学习在股票量化中的应用

深度学习在股票量化中的具体应用&#xff1a;从时间序列预测到Alpha挖掘深度学习并非量化交易的银弹&#xff0c;但它是一套强大的工具集&#xff0c;能够解决传统量化方法难以处理的复杂问题。其核心价值在于从海量、高维、非结构化的数据中自动提取有效特征并发现非线性关系。…

Web 安全之 HTTP 响应截断攻击详解

这不是危言耸听。 在一次安全审计中&#xff0c;某电商平台发现&#xff1a; 用户访问首页后&#xff0c;自动跳转到了赌博网站。 但代码没被篡改&#xff0c;服务器没被入侵&#xff0c;日志一切正常。 最终追查发现—— 罪魁祸首&#xff0c;竟是一个 %0d%0a&#xff08;回车…

Envoy配置ext_proc

介绍 本文将使用gateway api inference extension作为envoy的ext_proc服务端 启动Ext_Proc 基于Gateway API Inference Extension https://github.com/kubernetes-sigs/gateway-api-inference-extension.git 先clone代码到本地 git clone https://github.com/kubernetes-…

echarts关系图(Vue3)

基础版效果图&#xff1a;后期请求接口&#xff0c;接入数据即可用<template><div><v-chartref"vChartRef":option"option"style"width: 100%; height: 800px"></v-chart></div> </template><script lan…

【LeetCode】17. 电话号码的字母组合

文章目录17. 电话号码的字母组合题目描述示例 1&#xff1a;示例 2&#xff1a;示例 3&#xff1a;提示&#xff1a;解题思路算法分析问题本质分析回溯法详解组合生成过程可视化数字映射关系各种解法对比算法流程图边界情况处理时间复杂度分析空间复杂度分析关键优化点实际应用…

全文 part1 - DGEMM Using Tensor Cores, and Its Accurate and Reproducible Versions

摘要 本文提出了一种在 NVIDIA 图形处理器&#xff08;GPU&#xff09;的张量核心&#xff08;Tensor Cores&#xff0c;仅含 FP16、INT8 等 GEMM 计算功能&#xff09;上实现 FP64&#xff08;双精度&#xff0c;DGEMM&#xff09;和 FP32&#xff08;单精度&#xff0c;SGEMM…