1. 利用无名管道通信编写程序实现命令cat的功能。
时间: 2023-12-14 17:36:50 浏览: 104
下面是一个利用无名管道通信实现命令cat的简单程序:
```c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINE 4096
int main(int argc, char **argv) {
int n;
int fd[2];
pid_t pid;
char line[MAXLINE];
if (argc != 2) {
printf("Usage: %s <file>\n", argv[0]);
exit(1);
}
if (pipe(fd) < 0) {
printf("pipe error\n");
exit(1);
}
if ((pid = fork()) < 0) {
printf("fork error\n");
exit(1);
} else if (pid > 0) { /* parent */
close(fd[0]);
FILE *fp = fopen(argv[1], "r");
while (fgets(line, MAXLINE, fp) != NULL) {
n = strlen(line);
if (write(fd[1], line, n) != n) {
printf("write error to pipe\n");
exit(1);
}
}
if (ferror(fp)) {
printf("fgets error\n");
exit(1);
}
close(fd[1]);
wait(NULL);
} else { /* child */
close(fd[1]);
if (fd[0] != STDIN_FILENO) {
if (dup2(fd[0], STDIN_FILENO) != STDIN_FILENO) {
printf("dup2 error to stdin\n");
exit(1);
}
close(fd[0]);
}
execl("/bin/cat", "cat", (char *) 0);
}
exit(0);
}
```
该程序利用无名管道将从文件中读取的数据传递给子进程,子进程再利用cat命令输出到终端上。在父进程中,首先打开指定的文件,然后逐行读取文件内容并写入到管道中。在子进程中,首先关闭管道的写端,然后将管道的读端重定向到标准输入(stdin),最后调用execl函数执行cat命令。