news 2026/8/29 5:09:12

进程的创建与终止

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
进程的创建与终止

文章目录

  • 进程创建
    • fork函数
      • 多次`fork()`带来的问题
      • 创建“进程链”
      • 创建多个子进程
  • 进程终止
    • return语句
    • _exit()

进程创建

fork函数

#include<unistd.h>pid_tfork(void);
  • 功能:创建子进程
  • 返回值:
    • 父进程:返回子进程的PID(>0)
    • 子进程:返回0
    • 失败:返回-1
#include<stdio.h>#include<sys/types.h>#include<unistd.h>intmain(intargc,constchar*argv[]){pid_tpid=fork();if(pid<0){perror("fork");return-1;}elseif(pid>0){printf("这里是父进程\n");}else{printf("这里是子进程\n");}while(1)sleep(1);return0;}

多次fork()带来的问题

#include<sys/types.h>#include<unistd.h>#include<stdio.h>intmain(intargc,constchar*argv[]){pid_tpid;for(inti=0;i<4;i++){pid=fork();if(pid<0){perror("fork");return-1;}elseif(pid==0){printf("child process\n");}else{printf("parent process\n");}}intt=100;while(t--)sleep(1);return0;}
fork─┬─fork─┬─fork─┬─fork───fork │ │ └─fork │ ├─fork───fork │ └─fork ├─fork─┬─fork───fork │ └─fork ├─fork───fork └─fork

创建“进程链”

#include<sys/types.h>#include<unistd.h>#include<stdio.h>intmain(intargc,constchar*argv[]){pid_tpid;for(inti=0;i<4;i++){pid=fork();if(pid<0){perror("fork");return-1;}elseif(pid==0){printf("child process\n");}else{printf("parent process\n");break;}}intt=100;while(t--)sleep(1);return0;}
$ pstree7658fork02───fork02───fork02───fork02───fork02

创建多个子进程

#include<sys/types.h>#include<unistd.h>#include<stdio.h>intmain(intargc,constchar*argv[]){pid_tpid;for(inti=0;i<4;i++){pid=fork();if(pid<0){perror("fork");return-1;}elseif(pid==0){printf("child process\n");break;}else{printf("parent process\n");}}intt=100;while(t--)sleep(1);return0;}
$ pstree -p16911fork(16911)─┬─fork(16912)├─fork(16913)├─fork(16914)└─fork(16915)

进程终止

return语句

  • 一般的函数执行到return语句之后,就会结束,并通过return语句返回
  • main函数当中执行return n等同于执行对exit(n)的调用
  • 执行未指定返回值的return,或是无声无息地执行到main()函数结尾,同样会导致main()的调用者执行exit()函数,不同的C语言标准对此有不同的规定:
    • C89未规定具体的返回值
    • C99标准则要求,执行至main函数结尾处的情况应等同于调用exit(0)

注意:开发当中,应避免只写return,避免return 没有明确的返回值

  • 示例代码
#include<stdio.h>#include<stdlib.h>#include<unistd.h>intmain(void){printf("Hello World!");switch(fork()){case-1:perror("fork error");return-1;case0:exit(0);default:return1;}return1;}
  • exit()主要完成两件事:
    • 刷新 stdio 流缓冲区
    • 终止进程

_exit()

#include<unistd.h>void_exit(intstatus);
  • _exit()status参数定义了进程的终止状态(termination status)
  • shell当中可以通过echo $?得到status的值
  • 虽然将其定义为int类型,但仅有低8位可为父进程所用
  • 按照惯例:0表示进程“功成身退”,非0值则表示进程因异常而退出
  • 调用_exit()的程序总会成功终止(程序都结束了,再检查返回值已经没有意义了)
  • 示例代码
#include<stdio.h>#include<stdlib.h>#include<unistd.h>intmain(void){printf("Hello World!");switch(fork()){case-1:perror("fork error");exit(-1);case0:_exit(0);default:exit(0);}}
  • 进程的两种终止方式:
    • 异常(abnormal)终止,例如段错误。
    • 正常(normally)终止,调用_exit()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/25 7:48:21

Git cherry-pick提取关键PyTorch修复提交

Git cherry-pick 提取关键 PyTorch 修复提交 在大型 AI 团队的日常开发中&#xff0c;一个看似微小的框架 bug 就可能让整个训练任务卡在数据加载阶段。比如最近某项目组反馈&#xff1a;使用 PyTorch v2.7 的多进程 DataLoader 在特定条件下会随机死锁——查了一圈才发现社区早…

作者头像 李华
网站建设 2026/8/27 11:51:38

DiskInfo显示SMART信息解读:判断硬盘寿命

DiskInfo显示SMART信息解读&#xff1a;判断硬盘寿命 在数据中心机房的深夜巡检中&#xff0c;一位运维工程师突然收到一条告警通知——某台关键业务服务器的磁盘“重映射扇区数”异常上升。他迅速登录系统运行 DiskInfo&#xff0c;确认该盘 SMART 属性 ID5 已触发预警。尽管…

作者头像 李华
网站建设 2026/8/20 17:00:48

GitHub Pages部署PyTorch项目静态网站

GitHub Pages部署PyTorch项目静态网站 在人工智能项目开发中&#xff0c;一个常被忽视但至关重要的环节是&#xff1a;如何让别人真正“看到”你的成果。模型训练日志、Jupyter Notebook 和代码仓库固然重要&#xff0c;但如果合作者或评审者需要花半小时配置环境才能运行你的…

作者头像 李华
网站建设 2026/8/27 18:27:33

PyTorch-CUDA-v2.7镜像兼容性列表:支持显卡型号一览

PyTorch-CUDA-v2.7镜像兼容性解析&#xff1a;从技术原理到显卡支持全景 在深度学习项目中&#xff0c;最让人头疼的往往不是模型设计&#xff0c;而是环境配置——“在我机器上能跑”的尴尬场景屡见不鲜。尤其当团队协作、跨平台部署时&#xff0c;PyTorch 版本、CUDA 工具链、…

作者头像 李华
网站建设 2026/8/24 0:14:28

PHP+MySQL开源订水小程序源码:助力水站数字化转型,轻松搭建自有送水平台

温馨提示&#xff1a;文末有资源获取方式在送水行业数字化升级的背景下&#xff0c;一套高效、稳定且支持自主运营的在线订水系统成为众多水站与创业者的迫切需求。我们为您推荐一款基于经典技术架构开发的在线订水送水小程序源码&#xff0c;可快速帮助您构建专业的线上送水服…

作者头像 李华
网站建设 2026/8/28 20:25:35

SED: A Simple Encoder-Decoder for Open-Vocabulary Semantic Segmentation

Abstract 开放词汇语义分割旨在将像素划分为来自开放类别集合的不同语义组。现有的大多数方法依赖于预训练的视觉–语言模型&#xff0c;其中关键在于如何将图像级模型适配到像素级分割任务中。在本文中&#xff0c;我们提出了一种简单的编码器–解码器框架&#xff0c;称为 S…

作者头像 李华