在Linux系统中,如何利用`fork()`和`exec()`系统调用来创建子进程并执行特定程序?请提供示例代码。
时间: 2024-10-26 21:15:42 浏览: 8
在Linux系统中,`fork()`系统调用用于创建一个新的子进程,它是当前进程的副本。而`exec()`系列函数用于在当前进程空间加载并运行一个新的程序,替换掉原有的进程映像。这两个系统调用通常联合使用,以在子进程中执行新的程序。首先,我们来看一个使用`fork()`创建子进程的示例代码:
参考资源链接:[广州大学操作系统实验:进程管理与通信实战](https://wenku.csdn.net/doc/3kti604sqc?spm=1055.2569.3001.10343)
```c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main() {
pid_t pid = fork(); // 创建子进程
if (pid == -1) {
// fork失败处理
perror(
参考资源链接:[广州大学操作系统实验:进程管理与通信实战](https://wenku.csdn.net/doc/3kti604sqc?spm=1055.2569.3001.10343)
相关问题
使用系统调用fork()以创建一个子进程,并使用这个子进程调用exec函数族以执行系统命令ls。(使用函数execlp)
在Unix/Linux系统编程中,`fork()`是一个核心的系统调用,它用于创建一个新的进程(子进程),并将当前进程的所有状态复制给新进程。当你调用`fork()`,如果返回值为0,那么你就在子进程中;如果返回的是非零值,则是在父进程中。
接着,为了替换子进程的入口点并运行一个特定的程序,可以使用`exec`家族函数,如`execlp()`。`execlp()`是一个执行指定文件的路径和名称的函数,它会替换掉进程的当前执行环境。它的基本原型是:
```c
int execlp(const char *file, const char *arg0, ...);
```
其中,
- `file` 参数是要执行的程序的完整路径名,
- `arg0` 通常设置为程序的名称,`execlp()` 会将这个名称作为第一个命令行参数传递给新的进程。
下面是一个简单的示例,展示如何使用 `fork()` 和 `execlp()` 创建一个子进程执行 `ls` 命令:
```c
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#define PATH_TO_LS "/bin/ls"
int main() {
pid_t child_pid = fork(); // 创建子进程
if (child_pid == 0) { // 子进程
execvp(PATH_TO_LS, NULL); // 执行 ls 命令
perror("Failed to execute");
exit(EXIT_FAILURE);
} else if (child_pid > 0) { // 父进程
printf("Child process with PID %d created.\n", child_pid);
} else { // fork 失败
perror("Fork failed");
exit(EXIT_FAILURE);
}
return 0;
}
```
在这个例子中,如果 `fork()` 成功,子进程将立即执行 `ls` 命令,而父进程则继续执行后面的代码。
阅读全文