C管道编程:使用管道传递数据

时间:2013-05-11 02:41:11

标签: c linux pipe

我刚刚编写了以下代码: -

#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。

1 个答案:

答案 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();