- 用fork()创建一个子进程。 -子进程用execl或execve执行ls命令。 - 父进程调用waitpid函数等待子进程结束后,打印“child ended, father ending”,后结束进程。
时间: 2024-10-09 07:10:42 浏览: 55
在Unix/Linux系统编程中,可以使用`fork()`函数来创建一个新的进程(子进程),它会复制当前进程的所有状态,包括内存映射、打开文件描述符等。以下是步骤:
1. **使用`fork()`创建子进程**:
```c
#include <unistd.h>
int pid = fork(); // fork操作
if (pid == 0) { // 子进程
// 在这里执行后续操作,如设置工作目录、清理环境变量等
} else if (pid > 0) { // 父进程
// 子进程ID保存在pid变量中
} else {
perror("Fork failed"); // 如果fork失败,打印错误信息
exit(EXIT_FAILURE);
}
```
2. **子进程使用`execl`或`execve`执行ls命令**:
在子进程中,通常会替换掉原来的程序入口点,例如使用`execl`或其更安全版本`execve`执行其他程序,比如`ls`:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
if (pid == 0) {
execlp("ls", "ls", "-l", NULL); // 执行ls -l命令
perror("Failed to execute ls");
_exit(EXIT_FAILURE); // 使用_exit而非exit来避免影响父进程
}
```
3. **父进程等待子进程结束并打印消息**:
父进程调用`waitpid`等待子进程结束,然后继续执行:
```c
while (true) {
int status;
waitpid(pid, &status, 0); // 等待子进程结束
if (WIFEXITED(status)) {
printf("child ended, father ending\n");
break; // 子进程已正常退出,父进程结束
} else if (WIFSIGNALED(status)) {
printf("Child process terminated by signal %d\n", WTERMSIG(status));
} else {
printf("Unknown termination state for child.\n");
}
}
exit(0); // 父进程结束
```
阅读全文