2013-07-15 29 views
1

我想運行node.js作爲子進程併爲其提供輸入。使用C,這是我的一些示例代碼。pipe不被子進程讀取?

我遇到的問題是,雖然子進程的stdout仍然指向終端,但在給子進程標準輸入打印'Hello World'行後,我什麼都看不到。即使我()管道,我沒有看到輸出。但是,如果我關閉了管道的輸入,那麼終端上會出現'Hello World'。

子流程似乎只是緩衝 - 爲什麼? 我想最終將子進程stdout重定向到另一個管道,並從main()中讀入 。

INT主(INT的argc,字符* argv的[]){

int toNode[2]; 

    pipe(toNode); 

    pid_t child_pid = fork(); 
    if (child_pid == 0) { // child 

     // close write end 
     close(toNode[1]); 
     // connect read end to stdin 
     dup2(toNode[0], STDIN_FILENO); 


     // run node executable 
     char* arg_list[] = { "/usr/bin/node", NULL}; 
     execvp(arg_list[0], arg_list); 

     fprintf(stderr, "process failed to start: %s\n", strerror(errno)); 
     abort(); 
    } 
    else { // parent 

     FILE* stream; 

     // close read end 
     close(toNode[0]); 

     // convert write fd to FILE object 
     stream = fdopen(toNode[1], "w"); 

     fprintf(stream, "console.log('Hello World');\n"); 
     fflush(stream); 

     //close(toNode[1]); 


     waitpid(child_pid, NULL, 0); 

    } 

return 0; } 
+1

雖然[這個答案](http://stackoverflow.com/questions/1410849/bypassing-buffering-of-subprocess-output-with-popen-in-c-or-python)是指Python,它是一樣的潛在問題。你必須以某種方式說服*其他程序*來減少緩衝。 (我不知道是否可以告訴node.js這麼做,或者是否需要使用僞ttys。) – torek

回答

2

有與管道沒有問題被讀取。問題是如果/usr/bin/node檢測到stdin是交互式的,則默認情況下僅調用REPL(讀取評估打印循環)。如果您有足夠的最新版本nodejs,那麼您可以提供-i--interactive命令行標誌,但這不僅僅是讀取每行時執行的操作;它也將充當控制檯,包括將ANSI顏色序列插入輸出並打印每個表達式的值。

查看此forum thread瞭解更多信息。