我想了解如何將一個進程的輸出發送到子進程。我已經下了一個學習文件描述符和管道的旅程。我想我幾乎在那裏,但是缺少一個關鍵部分。將stdout餵給將execv()排序的子進程
這是我到目前爲止有:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int fd[2];
pid_t sort_pid;
/* Create the pipe */
if(pipe(fd) == -1) {
fprintf(stderr, "Pipe failed\n");
exit(EXIT_FAILURE);
}
/* create child process that will sort */
sort_pid = fork();
if(sort_pid < 0) { // failed to fork
fprintf(stderr, "Child Fork failed\n");
exit(EXIT_FAILURE);
}
else if(sort_pid == 0) { // child process
close(0); // close stdin
dup2(fd[0], 0); // make stdin same as fd[0]
close(fd[1]); // don't need this end of the pipe
execlp("D:/Cygwin/bin/sort", "sort", NULL);
}
else { // parent process
close(1); // close stdout
dup2(fd[1], 1); // make stdout same as fd[1]
close(fd[0]); // don't need this end of the pipe
printf("Hello\n");
printf("Bye\n");
printf("Hi\n");
printf("G'day\n");
printf("It Works!\n");
wait(NULL);
}
return EXIT_SUCCESS;
}
這是不行的,因爲它似乎進入一個無限循環或某事。我嘗試了wait()的組合,但這也沒有幫助。
我這樣做是爲了學習如何將這個想法應用到我的實際程序中。在我的實際程序中,我讀取文件,逐行解析它們並將處理後的數據保存到靜態結構數組中。我希望能夠根據這些結果生成輸出,並使用fork()和execv()系統調用對輸出進行排序。
這最終是一個uni項目。
這些都是我解剖去我在迄今爲止階段類似的例子:
- pipe() and fork() in c
- How to call UNIX sort command on data in pipe
- Using dup,pipe,fifo to communicate with the child process
而且我閱讀手冊頁上相關的系統調用來嘗試和理解它們。我會承認我對管道的知識並使用它們基本上沒有什麼,因爲這是我第一次嘗試使用它們。
任何幫助表示讚賞,甚至更多的信息來源,我可以看看自己。我似乎已經用盡了谷歌搜索給我的大部分有用的東西。
噢,我在execlp中使用絕對路徑來查看是否是這個問題,我也嘗試過使用相對路徑。 –
我想從第二個鏈接寫入,不是printf – nimday