进程相关的函数与exec函数簇

一、进程相关的函数

1.fork()

子进程:操作系统通过完整拷贝父进程0-3G的用户空间数据到子进程。

内核空间拷贝部分内容:PCB块

PID不拷贝

PPID不拷贝

程序执行的位置

文件管理

注意:

  1. 进程共用3G-4G这1G的内核空间;

  2. 但各自进程0-3G用户空间互相独立,不能互相通信。

  3. 进程间不能直接通信,要通信需要借助内核空间(IPC机制)

cpp 复制代码
pid_t fork(void);
功能:创建新的进程,新进程叫子进程,原来的进程叫父进程
参数:
返回值:
成功:父进程中返回子进程的PID号
子进程中返回0
失败:-1,没有新进程被创建
getpid():获取当前进程自己的PID号
getppid():获取当前进程的父进程的PID号

进程的退出:

  1. 进程执行结束退出

  2. 主函数中遇到return退出

  3. exit(),*exit()**、*Exit()结束进程

  4. 通过信号结束一个进程(kill -9 进程ID)

void exit(int status);

功能:退出一个进程

参数:

status:进程结束时的状态

0:正常退出

!0:因为其他原因退出

void _exit(int status);

void _Exit(int status);

僵尸进程和孤儿进程:

**僵尸进程:**进程已退出,但其资源空间没有被其父进程回收。

如何避免僵尸进程产生:

  1. 由其父进程对僵尸态进程进行回收:wait()、waitpid()

  2. 让进程称为孤儿进程,结束后,由操作系统回收。

**孤儿进程:**父进程先结束,其父进程创建的子进程成为孤儿进程,将会被系统进程所收养,结束后,由系统进程回收。

比如:守护进程

2.wait()/waitpid()

cpp 复制代码
#include <sys/types.h>
#include <sys/wait.h>

exit

pid_t wait(int *wstatus);
功能:阻塞回收僵尸态的进程资源空间和状态,
参数:
    wstatus :用来存储进程退出时的状态参数
返回值:
    成功:回收到的子进程ID号
    失败:-1
wait(NULL);   

pid_t waitpid(pid_t pid, int *status, int options);
功能:回收指定进程的资源
      和wait功能相似,比wait更灵活
参数:
pid:
    <-1 回收指定进程组内的任意子进程 (-100.等待GID=100的进程组中的任意子进程)
    -1 回收任意子进程,组内外
    0 回收和当前调用waitpid一个组的所有子进程,组内
    > 0 回收指定ID的子进程
status 子进程退出时候的状态,
       如果不关注退出状态用NULL;
options 选项:
    0 表示回收过程会阻塞等待
    WNOHANG 表示非阻塞模式回收资源。
返回值:成功 返回接收资源的子进程pid
        失败 -1
        设定为非阻塞且没有回收到子进程返回0
waitpid如果以阻塞方式回收和wait使用方式一样
如果父进程有任务需要执行,则可以选择waitpid非阻塞方式回收,此时搭配轮询方式实现。

二、exec函数簇

作用:在一个进程中,执行外部的一个可执行程序。

本质:exec将要执行的外部程序替换到了进程的文本区。

cpp 复制代码
int execl(const char *path, const char *arg, ...
/* (char *) NULL */);

参数:
    path :可执行行程序所在路径
    "/bin/ls"
    arg : 执行可执行程序时,传递的参数。
    NULL :参数的结束标志
返回值:
    失败:-1

int execlp(const char *file, const char *arg, ...
/* (char *) NULL */);
功能:执行PATH环境变量保存的路径中的可执行程序
参数:
    file :可执行文件的名称
    arg : 执行可执行程序时,传递的参数。
    NULL :参数的结束标志

int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
参数:
    path :可执行行程序所在路径
    file :可执行文件的名称
    argv :存放执行可执行程序时传递参数的指针数组

int execle(const char *path, const char *arg, ...
/*, (char *) NULL, char * const envp[] */);

int execvpe(const char *file, char *const argv[],
char *const envp[]);

l : list--》列表
p : PATH :环境变量 :保存了系统中已有的可执行程序的存放路径
v : vector :容器
相关推荐
FITA阿泽要努力17 分钟前
第1周·第2讲|一道综合代码推演
服务器·前端·python·agent.
HUIBUR科技20 分钟前
多系统整合不必搭建中台:AI中枢带来轻量化数字化集成
大数据·运维·人工智能
小羊没烦恼!27 分钟前
关于大型asp.net应用系统的架构-架构的选择
java·服务器·开发语言·前端·c#
凯歌的博客32 分钟前
docker镜像代理
运维·docker·容器
2301_7779983435 分钟前
TCP连接断开:进程终止、主机断电与网络断开
linux·服务器·网络·tcp/ip
xixiaoyunya39 分钟前
高校教学资料备份:校园内网自动化备份完整方案
运维·自动化
发量惊人的中年网工1 小时前
服务器托管一个机柜一年多少钱?2026年9月最新机柜租用价格参考
运维·服务器·网络
星恒随风1 小时前
Linux进程基础(二):进程调度、上下文切换、O(1)调度器、环境变量与虚拟地址空间
linux·笔记·学习·状态模式
fundoit1 小时前
资源服务器如何对 JWT 进行验签
java·运维·服务器·spring boot·php·oauth2
云贝贝贝1 小时前
【无标题】TDSQL 分片键怎么选?选错等于数据倾斜加跨分片慢查询
运维·服务器·数据库·腾讯云