如何利用匿名管道让父进程写文件、子进程读文件?如何使用dup2函数让操作变得更简单?
时间: 2024-03-12 13:44:24 浏览: 162
我们可以通过创建匿名管道来实现父进程写文件,子进程读文件的功能。具体步骤如下:
1. 调用 `pipe()` 函数创建匿名管道,该函数会返回两个文件描述符,一个用于读取数据,一个用于写入数据。
2. 调用 `fork()` 函数创建子进程,此时父进程和子进程都拥有管道的读写文件描述符。
3. 在父进程中关闭管道的读取文件描述符,子进程中关闭管道的写入文件描述符。
4. 父进程中使用 `write()` 函数将数据写入管道的写入文件描述符中。
5. 子进程中使用 `read()` 函数从管道的读取文件描述符中读取数据。
使用 `dup2()` 函数可以将文件描述符复制到指定的文件描述符,从而简化操作。例如,我们可以将管道的读写文件描述符复制到标准输入输出文件描述符,从而实现方便的输入输出操作。
代码示例:
```c
#include <stdio.h>
#include <unistd.h>
int main() {
int fd[2];
pid_t pid;
char buf[256];
pipe(fd);
pid = fork();
if (pid < 0) {
printf("fork error\n");
return -1;
} else if (pid == 0) {
// 子进程
close(fd[1]); // 关闭管道的写入文件描述符
dup2(fd[0], STDIN_FILENO); // 将管道的读取文件描述符复制到标准输入文件描述符
execlp("cat", "cat", NULL); // 执行cat命令读取管道中的数据
} else {
// 父进程
close(fd[0]); // 关闭管道的读取文件描述符
dup2(fd[1], STDOUT_FILENO); // 将管道的写入文件描述符复制到标准输出文件描述符
printf("Hello, world!\n"); // 将数据写入管道
}
return 0;
}
```
阅读全文