我知道如何在 Linux 中使用 C 创建一个看起来像 cat/tmp/txt |grep foo
的管道,但是我在实现多个链式管道时遇到了问题,例如 cat/tmp/1.txt | uniq-c |排序
。如何在 Linux 中使用 pipe()
用 C 实现?
更新:我已经弄明白了。如果有人有同样的问题,这里是代码:
enum PIPES {
READ, WRITE
};
int filedes[2];
int filedes2[2];
pipe(filedes);
pipe(filedes2);
pid_t pid = fork();
if (pid == 0) {
dup2(filedes[WRITE], 1);
char *argv[] = {"cat", "/tmp/1.txt", NULL};
execv("/bin/cat", argv);
exit(0);
}
else {
close(filedes[1]);
}
pid = fork();
if (pid == 0) {
dup2(filedes[READ], 0);
dup2(filedes2[WRITE], 1);
char *argv[] = {"uniq", "-c", NULL};
execv("/usr/bin/uniq", argv);
}
else {
close(filedes2[1]);
}
pid = fork();
if (pid == 0) {
dup2(filedes2[READ], 0);
char *argv1[] = {"sort", NULL};
execv("/usr/bin/sort", argv1);
}
waitpid(pid);
最佳答案
你得到一对文件描述符 - 我们称它们为 a
和 b
。对 pipe
的后续调用会为您提供文件描述符 c
和 d
。
因此,您将 b
连接到 c
以链接这两个进程。创建另一对文件描述符并将 d
连接到 e
,等等。
关于使用 pipe() 在 linux 中链接管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8300301/