Linux 进程、线程与 exec/系统调用详解

发布于:2025-08-16 ⋅ 阅读:(12) ⋅ 点赞:(0)

1. waitwaitpid —— 子进程资源回收

1.1 wait

pid_t wait(int *wstatus);

功能:阻塞等待,回收任意子进程的资源空间。

参数

   wstatus:保存子进程退出状态的变量地址

   NULL:不保存退出状态

返回值

        成功:返回回收的子进程 PID

        失败:返回 -1

1.2 waitpid

pid_t waitpid(pid_t pid, int *status, int options);

功能:回收指定子进程的资源,功能比 wait 更灵活。

参数

pid

   < -1:回收指定进程组内的任意子进程例如 -100 表示等待 GID=100 的进程组

   -1:回收任意子进程(组内外)

   0:回收与当前调用者同一组的所有子进程

   > 0:回收指定 PID 的子进程

status

       保存子进程退出状态NULL:不关心退出状态

options

   0:阻塞等待WNOHANG:非阻塞等待

返回值

        成功:返回回收的子进程 PID

        失败:-1

        非阻塞模式下且没有子进程退出:返回 0

1.3 子进程资源回收策略

  1. wait 阻塞回收:父进程专门等待子进程退出

  2. waitpid 非阻塞回收:配合轮询实现

  3. 不回收:子进程一直运行

  4. 异步回收:子进程退出时通知父进程回收

2. exec 函数族 —— 在当前进程中执行其他程序

2.1 execl

int execl(const char *path, const char *arg, ... /* (char  *) NULL */);

功能:执行指定路径的可执行文件。
本质:将当前进程的代码段替换成新程序,不创建新进程。

参数

  path:可执行文件路径

  arg:传给程序的参数,第一个参数一般是程序名

  NULL:参数结束标志

返回值

        成功:无返回(被新程序替换)

        失败:-1

2.2 execlp

int execlp(const char *file, const char *arg, ... /* (char  *) NULL */);

功能:从 PATH 环境变量指定的目录中查找可执行文件。

2.3 execle

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

功能:指定环境变量执行新程序。

2.4 execv

int execv(const char *path, char *const argv[]);

功能:与 execl 类似,但用 数组 传递参数。

2.5 execvp

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

功能:与 execlp 类似,但用 数组 传递参数。

2.6 execvpe

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

功能:结合 PATH 搜索 + 指定环境变量。

3. system —— fork + exec 封装

int system(const char *command);

功能:调用 fork() 创建子进程,并在子进程中执行 exec 族函数。

区别

   exec:不创建新进程,直接替换当前进程代码

   system:先 fork 再 exec,创建新的进程

4. 线程基础

4.1 线程概念

线程:轻量级进程,是 CPU 调度的最小单位

进程:操作系统资源分配的最小单位

4.2 进程 vs 线程

特性 进程 线程
调度单位 资源分配最小单位 CPU 调度最小单位
资源消耗 创建需分配独立虚拟地址空间(0~4G) 仅分配栈空间(默认 8M)
通信方式 需 IPC 机制 可直接共享全局变量
安全性 高,地址空间隔离 低,可能相互影响
创建速度 较慢 较快

4.3 线程创建

#include <pthread.h>

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                   void *(*start_routine) (void *), void *arg);

参数

  thread:线程 ID 存放位置

  attr:线程属性(NULL 表示默认)

  start_routine:线程入口函数

  arg:传递给线程入口函数的参数

返回值

        成功:0

        失败:非 0

4.4 常用线程函数

pthread_self();   // 获取当前线程 ID
pthread_exit();   // 线程主动退出
pthread_join();   // 回收线程资源

总结

wait / waitpid 用于子进程资源回收

exec 族函数用于执行新程序,不会创建新进程

system 封装了 fork + exec

线程是轻量级进程,开销小但安全性低


网站公告

今日签到

点亮在社区的每一天
去签到