(2)编写另一个C程序,使用系统调用fork()以创建一个子进程,并使用这个子进程调用exec函数族以执行系统命令ls。(使用函数execlp)
时间: 2024-10-09 09:08:24 浏览: 92
Linux中使用C语言的fork()函数创建子进程的实例教程
当你想要在C语言中通过系统调用创建一个新的子进程并让它执行特定的系统命令,可以结合`fork()`和`exec*()`家族函数。下面是一个简单的例子,它演示了如何使用`fork()`创建子进程,然后使用`execlp()`执行`ls`命令:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
// Step 1: Fork a new process
pid_t child_pid = fork(); // 创建子进程
if (child_pid == -1) {
perror("Fork failed");
exit(EXIT_FAILURE);
} else if (child_pid == 0) { // 子进程
// Step 2: Close the parent's copy of stdin, stdout, and stderr
close(0); // 关闭子进程的stdin
close(1); // 关闭子进程的stdout
close(2); // 关闭子进程的stderr
// Step 3: Execute the ls command using execlp()
char *cmd[] = {"ls", NULL}; // 执行"ls"命令数组
execlp(cmd[0], cmd[0], (char *)NULL); // 使用execlp替换当前进程
perror("execlp failed");
exit(EXIT_FAILURE);
} else { // Parent process
// Step 4: Wait for the child to finish and print its PID
int status;
waitpid(child_pid, &status, 0);
printf("Child process with PID %d exited.\n", child_pid);
}
return 0;
}
```
在这个程序中,主进程中首先调用`fork()`,如果成功,会返回子进程ID;否则返回-1。在子进程中,我们关闭了标准输入、输出和错误流,因为`execlp()`会接管它们。然后使用`execlp()`执行指定的命令,这里我们选择了`ls`。
注意,`execlp()`函数会立即替换当前进程,所以原父进程不会继续执行之后的代码。父进程通过`waitpid()`等待子进程结束,并打印其PID。
阅读全文