利用无名管道通信编写程序实现命令cat的功能
时间: 2024-05-12 07:14:39 浏览: 20
以下是一个基于无名管道通信的实现 cat 命令的示例程序:
```c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINE 4096
int main(void)
{
int n;
int fd[2];
pid_t pid;
char buf[MAXLINE];
if (pipe(fd) < 0) {
perror("pipe error");
exit(1);
}
if ((pid = fork()) < 0) {
perror("fork error");
exit(1);
} else if (pid > 0) { /* parent */
close(fd[0]); /* close read end */
while (fgets(buf, MAXLINE, stdin) != NULL) {
n = strlen(buf);
if (write(fd[1], buf, n) != n) {
perror("write error");
exit(1);
}
}
if (ferror(stdin)) {
perror("fgets error");
exit(1);
}
close(fd[1]); /* close write end */
waitpid(pid, NULL, 0); /* wait for child */
exit(0);
} else { /* child */
close(fd[1]); /* close write end */
if (fd[0] != STDIN_FILENO) {
if (dup2(fd[0], STDIN_FILENO) != STDIN_FILENO) {
perror("dup2 error");
exit(1);
}
close(fd[0]);
}
execl("/bin/cat", "cat", (char *)0);
perror("execl error");
exit(1);
}
}
```
程序通过 `pipe` 创建了一个无名管道,然后 `fork` 出一个子进程。父进程从标准输入读取输入,并将其写入管道中;子进程将管道的读端重定向到标准输入,然后使用 `execl` 执行 cat 命令。这样,父进程就能将输入传递给子进程,实现了 cat 命令的功能。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)