1、 使用fork( )、vfork( )创建进程 2、进程中使用exec函数
时间: 2024-10-13 17:12:28 浏览: 59
1. **使用 fork() 和 vfork() 创建进程**:
- `fork()` 函数在C标准库中用于创建一个新的子进程。父进程调用 `fork()` 后,会返回两个进程 ID(PID)值。如果成功,父进程返回复制后的子进程 PID(0 对于子进程,非零值对于父进程),而子进程返回的是其父进程的 PID。子进程从父进程继承了所有已打开的文件描述符、环境变量等。
```c
#include <unistd.h>
pid_t pid = fork(); // 如果是父进程,pid将是大于0的整数;如果是子进程,pid将是0
```
- `vfork()` 是一个特殊的 fork(),在子进程完成初始化(包括执行构造函数)后返回。这意味着子进程会在执行到第一个 `return` 或 `exit()` 语句时返回给父进程。要注意的是,由于没有完全复制环境,`vfork()` 存在潜在风险,如共享的数据可能被修改导致不确定的行为。通常推荐使用 `fork()` 替代。
2. **进程中使用 exec() 函数**:
- `exec()` 家族函数用于替换当前进程的执行上下文,即加载并运行一个新的程序代替当前进程。这组函数包括 `execl()`, `execlp()`, `execle()`, `execvp()`, `execvpe()` 等。它们的区别在于如何寻找要执行的程序:
- `execl()` 和 `execlp()` 接收绝对路径名,直接指定程序。
- `execle()` 接收程序名和参数列表,可以直接传递命令行字符串。
- `execvp()` 和 `execvpe()` 则根据 PATH 环境变量查找程序名,类似于 shell 的行为,同时支持解析环境变量。
执行 `exec()` 之后,原来的进程会被终止,资源会被回收,除非有明确的不清理行为(例如使用 `setsid()` 或 `fork()` 结合 `exec*()`)。
示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <command>\n", argv[0]);
return 1;
}
execlp(argv[1], argv[1], NULL); // 尝试执行命令
perror("Failed to execute command");
exit(EXIT_FAILURE);
}
```
阅读全文