我刚刚编写了以下代码: -
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
// Create a pipe
int fd[2];
pipe(fd);
int i;
close(0); //close the input to this process
dup(fd[0]); // duplicate the input of this pipe to 0, so that stdin now refers to the input of the pipe
char *test[3] = {"A", "B", "C"};
for ( i=0 ; i < 3; ++i ) {
write(fd[0], test[i], strlen(test[i]));
write(fd[0], '\n', 1);
}
execlp("sort", "sort", NULL);
return 0;
}
我希望sort
从管道fd[1]
的输出中获取输入,并将已排序的输出打印到stdout。
答案 0 :(得分:3)
首先,检查系统调用的错误。您已经看过EBADF。
r = write(fd[0], ...);
if (r == -1 && errno == EBADF) oops();
其次,写入管道的 write 端:
r = write(fd[1], ...); /* Not fd[0] ! */
第三,将换行符作为字符串而不是char:
r = write(fd[1], "\n", 1); /* Not '\n' */
第四,完成时关闭管道的写入端,否则sort(1)
将永远阻止永远不会到达的输入:
for (...) {
r = write(fd[1], ...);
}
close(fd[1]);
execlp("sort", "sort", NULL);
oops_exec_failed();