#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#define STDIN 0
#define STDOUT 1
int main(int argc, char* argv[]) {
// channel[0] read & channel[1] wirte
int channel[2] = {0};
int STDOUT_BACKUP = dup(STDOUT);
int STDIN_BACKUP = dup(STDIN);
// 创建管道
pipe(channel);
int ret = fork();
if (ret) {
// 父进程 关闭写端
close(channel[1]);
wait(NULL);
// 将读端重定向到标准输入
dup2(channel[0], STDIN);
int destFile = open("./r.txt", O_CREAT|O_WRONLY, S_IRUSR);
dup2(destFile, STDOUT);
// 运行wc 从标准输入读入数据, 输出到标准输出->r.txt
if (!fork()) {
execlp("wc", "wc", "-l", NULL);
} else {
wait(NULL);
dup2(STDOUT_BACKUP, STDOUT);
dup2(STDIN_BACKUP, STDIN);
// 关闭文件描述符
close(destFile);
close(channel[0]);
// 执行cat命令
execlp("ls", "ls", "-l", NULL);
fflush(NULL);
}
} else {
// 子进程 关闭读端
close(channel[0]);
int fromFile = open("/etc/passwd", O_RDONLY);
dup2(fromFile, STDIN);
dup2(channel[1], STDOUT);
close(fromFile);
// 发送EOF
close(channel[1]);
execlp("grep", "grep", "-v", "usr", NULL);
}
return 0;
}
北邮linux 管道 编程实践 等价指令
最新推荐文章于 2023-06-07 22:13:06 发布