当前位置: 首页 > news >正文

进程的创建与终止

文章目录

  • 进程创建
    • 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()
http://www.gsyq.cn/news/174879.html

相关文章:

  • GitHub Pages部署PyTorch项目静态网站
  • zz 掌握python的dataclass,让你的代码更简洁优雅
  • 什么是快捷支付?
  • 最新扣扣秒赞系统源码
  • Markdown制作目录:长篇PyTorch教程结构化
  • 2025商用智能清洁设备TOP5深度测评:智然达智能清洁设备性价比、兼容性权威解析 - mypinpai
  • SSH连接复用减少PyTorch集群登录延迟
  • 你不允许不知道!西电通信工程学院复试录取数据
  • 2025年度东元高压电机代理合作伙伴排名:东元高压电机代理好不好 - 工业品网
  • 轨道影院是什么?9dvr体验馆设备多少钱?
  • PyTorch-CUDA-v2.7镜像安全更新:修复CVE漏洞
  • 2025年智然达智能清洁设备行业排行榜,新测评精选清洁机器人公司推荐 - 工业设备
  • 2025年高性价比GEO服务商推荐:技术驱动下的精准营销新选择 - 品牌测评鉴赏家
  • GitHub Wiki搭建PyTorch项目文档站
  • Vue3基于springboot校园兼职学生服务平台的设计与实现(编号:918933100)
  • 2025诚信的抖音推广企业TOP5权威推荐:制造业短视频获客指南 - 工业品牌热点
  • 基于buck降压电路的双闭环控制仿真:PI调节器设计与数学模型建模
  • 2025切捆条机制造商TOP5权威推荐:深度测评指南,甄选实力企业助力裁切效率升级 - 工业推荐榜
  • 剪切板神器,绝了
  • Git标签管理PyTorch项目版本:release流程规范
  • 2025年防火封堵材料行业企业实力排名:昊优环保可信度高吗? - 工业品牌热点
  • SED: A Simple Encoder-Decoder for Open-Vocabulary Semantic Segmentation
  • 2025年游泳池设备定制厂家排行榜,新测评精选游泳池设备制造厂推荐 - 工业品牌热点
  • 2025防撞板品牌TOP5权威推荐:专业定制、发货快速、商家深度测评指南 - 工业推荐榜
  • 清华镜像加速pip install torch:提升90%下载速度
  • PyTorch自定义数据集类Dataset实战教程
  • PyTorch v2.7新特性解析:性能提升背后的黑科技
  • GitHub Projects管理PyTorch开发进度
  • Git stash暂存修改:切换PyTorch实验分支技巧
  • 利用PyTorch镜像快速部署大模型Token生成服务