我知道如何使用看起来像cat /tmp/txt |grep foo
的C在Linux中创建一个管道,但是我在实现多个链式管道时遇到了问题,例如cat /tmp/1.txt | uniq -c | sort
。如何在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);
答案 0 :(得分:2)
你得到一对文件描述符 - 我们称之为a
和b
。随后对pipe
的调用会为您提供文件描述符c
和d
。
因此,您要将b
连接到c
,以便将这两个进程链接起来。例如,创建另一对文件描述符并将d
连接到e
,依此类推。
答案 1 :(得分:1)
管道有两端(读取和写入),pipe()因此将两个文件描述符放在您指定的数组中。第一个是读端,第二个是写端。
因此,在您的示例中,您将创建两个管道:
cat
的标准输出连接到第一个管道的写入端uniq
的标准输入连接到第一个管道的读取端uniq
的标准输出连接到第二个管道的写入端sort
的标准输入连接到第二个管道的读取端。