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

[Linux进程控制]进程创建|进程终止|进程等待

目录

一、进程创建

1.fork函数

2.写实拷贝

二、进程终止

1.进程退出场景

2.进程常见退出方法

(1)从main函数返回

(2)_exit

(3)调用exit

三、进程等待

1.进程等待的方法

(1)wait方法

(2)waitpid方法

2.获取子进程的status


一、进程创建

1.fork函数

#include <unistd.h>
pid_t fork(void);
//返回值:子进程中返回0,父进程返回子进程的id,出错返回-1
  • 代码实例:
#include <stdio.h>
#include <unistd.h>
int main()
{pid_t pid;printf("Before: pid is %d\n", getpid());if((pid = fork()) == -1 ) perror("fork()"),exit(1);printf("After:pid is %d, fork return %d\n", getpid(), pid);sleep(1);return 0;
}
  • 运行结果:

  • 此时内部指向如下:

fork 之前父进程独立执行, fork 之后,父子两个执行流分别执行

2.写实拷贝

通常,父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本。具体见下图:

二、进程终止

1.进程退出场景

  • 代码运行完毕,结果正确
  • 代码运行完毕,结果不正确
  • 代码异常终止

2.进程常见退出方法

(1)从main函数返回

  • 查看进程退出码的方式:echo $?
  • 当退出码为0时表示成功退出;退出码不为0时表示异常退出,不同数字表示不同错误原因
  • 1:表示一般性的错误或命令未能找到指定的文件或目录
  • 2:表示用法错误或命令的某些参数不正确
  • 126:表示命令不可执行
  • 127:表示命令未找到
  • 128及以上:通常表示由信号引起的退出

(2)_exit

#include <unistd.h>
void _exit(int status);
//status定义了进程终止状态,表示退出码

(3)调用exit

#include <unistd.h>
void _exit(int status);
//status定义了进程终止状态,表示退出码
exit 最后也会调用 exit, 但在调用 exit 之前,还做了其他工作:
  • 执行用户通过 atexit或on_exit定义的清理函数。
  • 关闭所有打开的流,所有的缓存数据均被写入
  • 调用_exit


三、进程等待

1.进程等待的方法

(1)wait方法

#include <sys/types.h>
#include <sys/wait.h>pid_t wait(int *status);//返回值:成功则返回被等待进程得pid;失败则返回-1
//参数:输出型参数,获取子进程退出状态,不关心则可设置为NULL

(2)waitpid方法

pid_ t waitpid(pid_t pid, int *status, int options);
//返回值:
//   当正常返回的时候waitpid返回收集到的子进程的进程ID;
//    如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
//    如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;
参数:
//    pid:
//         Pid=-1,等待任一个子进程。与wait等效。
//         Pid>0.等待其进程ID与pid相等的子进程。
//    status:
//        WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)
//        WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)
//    options:
//        WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进程的ID。

2.获取子进程的status

  • wait和waitpid,都有一个status参数,该参数是一个输出型参数,由操作系统填充,传递NULL,表示不关心子进程的退出状态信息,操作系统会根据该参数,将子进程的退出信息反馈给父进程
  • status不能简单的当作整形来看待,可以当作位图来看待


http://www.mrgr.cn/news/61248.html

相关文章:

  • C++-回调函数导致std::sort crash
  • rtthread学习笔记系列--18 信号 SIGNAL
  • 【已解决】git clone报错:Failed to connect to github.com port 443: Timed out
  • RabbitMQ介绍与使用
  • IIS安全配置基线
  • python+pymysql
  • 练习pandas的基础操作,有题目有详解有源码
  • 使用不可靠来源的住宅代理的风险
  • 怎么提取视频里的音频?关于提取视频里音频的几种方法
  • Gartner发布生成式AI的信任、风险和安全管理创新指南:生成式AI的三类风险—内容异常、数据安全和AI应用安全
  • 从理论到实践,精准测试的初创之路
  • Jmeter压力测试简单教程(包括服务器状态监控)
  • 6.标志寄存器
  • 雷池社区版compose配置文件解析-mgt
  • Android实现扫描二维码条形码,实现扫描快递单,相册图片识别快递单 最慢3秒出回调结果
  • WordPress中最值得推荐的AI插件:专家级指南
  • 【动手学强化学习】part7-Actor-Critic算法
  • 自适应神经网络架构:原理解析与代码示例
  • linux系统安装软件的三种方式
  • JavaEE初阶------网络编程续+传输层UDP协议介绍
  • WebGL 3D基础
  • 当变频器报警过热故障时,如何处理
  • 基于SSM的智能台球厅系统
  • CAN物理层(ISO 11898-2 2024)
  • 《掌握 Java:从基础到高级概念的综合指南》(11/15)
  • 解决goravel/gorm自动迁移AutoMigrate 时会将关联关系也一并迁移问题