linux子进程如何执行
linux子进程如何执行详细介绍
在 Linux 系统中,子进程的执行通常通过 fork() 创建子进程,然后通过 exec 族函数 让子进程执行新的程序。以下是详细的流程和实现方法:
一、创建子进程:
fork()
1. 函数作用
fork()用于创建一个子进程,子进程是父进程的副本,二者共享代码段,但数据段、堆、栈等会通过 写时复制(Copy-on-Write) 机制分开。- 调用后会返回两次:
- 父进程中返回 子进程的 PID(正整数);
- 子进程中返回 0;
- 错误时返回 -1。
2. 示例代码
c
pid
pid
pid
pid
二、子进程执行新程序:
exec 族函数
1. 为什么需要
exec?
fork()后,子进程默认执行父进程的后续代码。若想让子进程执行其他程序(如/bin/ls或自定义程序),需用exec族函数替换子进程的内存空间。
2.
exec 族函数
共有 6 个函数,功能相同,参数形式不同:
execl(const char *path, const char *arg, ...):按路径执行,参数逐个传递(以NULL结尾)。execv(const char *path, char *const argv[]):按路径执行,参数通过数组传递。execle(const char *path, const char *arg, ..., char *const envp[]):带环境变量的execl。execve(const char *path, char *const argv[], char *const envp[]):带环境变量的execv(唯一系统调用,其他为库函数)。execvp(const char *file, const char *arg, ...):按文件名执行(会搜索PATH环境变量)。execvpe(const char *file, char *const argv[], char *const envp[]):带环境变量的execvp。
3. 示例:子进程执行
ls -l
c
pid
pid
pid
三、核心流程总结
- 父进程调用
fork(),创建子进程。 - 子进程通过返回值
pid == 0识别自己,并调用exec族函数。 exec函数用新程序替换子进程的内存空间,包括代码、数据、堆、栈等,子进程从新程序的main函数开始执行。- 父进程通常调用
wait()或waitpid()等待子进程结束,回收资源。
四、关键特性
- 写时复制(Copy-on-Write):
fork()后,父子进程共享内存,仅当其中一方修改数据时才复制,提高效率。 - 独立地址空间:
exec后,子进程与父进程完全独立,互不影响。 - 错误处理:
exec函数若失败(如文件不存在),会返回-1,并继续执行exec之后的代码(需显式处理)。
五、常见场景
- 启动外部程序:如 Shell 中输入命令时,父进程(Shell)创建子进程并通过
exec执行命令。 - 多任务处理:父进程创建多个子进程,每个子进程执行不同的任务(如 Web 服务器处理多个请求)。
通过 fork() 和 exec 的配合,Linux 实现了灵活的进程创建与程序执行机制。