2016-11-15 22 views
0

在命令行上,sort程序可以給予輸入,^D作爲輸入排序程序如何遇到EOF?

$ sort 
xyz 
def 
abc 
^D 

abc 
def 
xyz 

下面程序正在使用管來執行相同的端部,

#include<stdio.h> 
#include<stdlib.h> 


int main(void){ 

    FILE *pipeFP; 
    char *str[3] = {"xyz\n", "def\n", "abc\n"}; 

    if((pipeFP = popen("sort", "w")) == NULL){ 
    perror("popen error"); 
    exit(1); 
    } 

    /* 
    popen() performs the following: 
    1) In parent process, calls pipe() for creating two descriptors, read descriptor is closed, write descriptor is converted to FILE type stream 
    2) In parent process, calls fork() to create child process and execs with sort program. 
    3) In child process, write end descriptor is closed, read descriptor is dup2 to stdin 
    */ 


    /* Sending string list to sort program*/ 
    fputs(str[0], pipeFP); 
    fputs(str[1], pipeFP); 
    fputs(str[2], pipeFP); 

    pclose(pipeFP); 
} 

在這種程序,^D未發送至sort子進程,sort如何實現e nd的輸入?

+1

你正在關閉管道幾乎終止輸入流.... –

+0

@EugeneSh。你的意思是,在關閉寫入流('pclose(pipeFP)')後實際給出輸出 – overexchange

+0

你可以很容易地驗證它... –

回答

0

From the pclose man page

pclose()功能必須關閉,是由popen()開流, 等待命令終止,並返回所運行的命令語言解釋過程的終止狀態 。

sort程序做一些類似的(僞代碼):

buffer = [] 
while true { 
    line = readline(stdin) 
    if line == EOF { 
     break 
    } 
    buffer += line 
} 
print(sort_lines(buffer)) 
exit 

當你調用pclose(pipeFP)它關閉sortstdin管(這將導致sort讀取一個EOF),然後等待直到sort退出。