0

我刚刚写了以下代码:-

#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]并将排序的输出打印到标准输出。

4

1 回答 1

3

首先,检查系统调用的错误。你会看到一个 EBADF。

r = write(fd[0], ...);
if (r == -1 && errno == EBADF) oops();

二、写到管道的端:

r = write(fd[1], ...); /* Not fd[0] ! */

第三,将换行符作为字符串而不是字符传递:

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();
于 2013-05-11T03:54:52.390 回答