我正在使用管道将一组数字发送到另一个进程来对它们进行排序。到目前为止,我可以使用fdopen从另一个进程获得结果。但是,我无法弄清楚如何从管道发送数据作为stdin用于另一个进程。
这是我的代码:
那么,其他过程如何获得输入? SCANF?int main () { int fd[2], i, val; pid_t child; char file[10]; FILE *f;
pipe(fd); child = fork(); if (child == 0) { close(fd[1]); dup2(fd[0], STDIN_FILENO); close(fd[0]); execl("sort", "sort", NULL); } else { close(fd[0]); printf ("BEFORE\n"); for (i = 100; i < 110; i++) { write(fd[1], &i, sizeof (int)); printf ("%d\n", i); } close(fd[1]); wait(NULL); } }
pipe(fd); child = fork(); if (child == 0) { close(fd[1]); dup2(fd[0], STDIN_FILENO); close(fd[0]); execl("sort", "sort", NULL); } else { close(fd[0]); printf ("BEFORE\n"); for (i = 100; i < 110; i++) { write(fd[1], &i, sizeof (int)); printf ("%d\n", i); } close(fd[1]); wait(NULL); } }
答案 0 :(得分:0)
我认为您的管道设置正确。问题可能从execl()
开始。对于此调用,您应指定绝对路径,如果您指的是Unix实用程序,则可能为/bin/sort
。还有一个版本的呼叫execlp()
可以在PATH上自动搜索。
下一个问题是sort
是基于文本的,更具体地说是基于行的,并且您正在向其STDIN发送二进制垃圾。
在父进程中,您应该将格式化文本写入管道。
FILE *wpipe = fdopen(fd[1], "w");
for (i = 100; i < 110; i++) {
fprintf(wpipe, "%d\n", i);
...
}
fclose(wpipe);
从110下降到100的反向循环可能会更好地测试您的排序。