2012-12-30 141 views
0

發送命令到正在運行的過程中,我有作爲服務運行,這需要從控制檯標準輸入,並打印反饋到屏幕的程序。它可以被認爲是以下簡單的例子,而printf()函數其實是一些比較複雜的函數。使用命名管道

//keyin.c 
int main(int argc, char *argv[]) 
{ 
    char buf[80]; 
    int i = 1; 

    while(i++){ 
    printf("enter %d string: \n", i); 
    scanf("%s", buf); 
    printf("print %d string: %s \n\n", i, buf); 
    sleep(2); 
    } 

    return 0; 
} 

現在我想使用命名管道作爲輸入,這樣我可以使用其他程序寫入到管道,而不是在控制檯中輸入所需的命令傳遞給服務。

我通過創建一個命名管道:

mknod MYFIFO p 

,然後我通過重定向輸入:

[email protected]: ./keyin < MYFIFO 

,然後我通過將命令寫入管:

[email protected]: echo "test" > MYFIFO 

我希望服務能夠接受「測試」,將其打印出來,然後等待下一次輸入,但是在第一次運行後,它會繼續打印無限次地進行「測試」,即使刪除它,也不會再次響應管道文件。

我做錯了什麼?

回答

1

您應該檢查的scanf()返回值。請注意,每次您獲得相同的重複緩衝區時,scanf()都會返回負值。

int main(int argc, char *argv[]){ 
    char buf[80]; 
    int i = 1; 
     while(i++){ 
     if(scanf("%s", buf) > 0){ 
      printf("print %d string: %s \n\n", i, buf); 
     } 
     sleep(2); 
    } 
    return 0; 
} 

而且,請注意,命名管道不是一個普通的管道或控制檯和表現不同。

+0

謝謝回答。你的解決方案在這個scanf/printf的情況下工作,但while()循環繼續運行。我真正的程序比簡單的scanf()複雜得多,因此我無法做到這一點。我希望有一個解決方案可以讓程序掛在那裏直到下一個命令發佈。除了名稱管道之外,你還有其他解決方案嗎?假設我只有一個二進制可執行文件test.exe,它需要鍵盤輸入並做相應的操作。現在我想讓test.exe運行後臺作爲服務並使用另一個程序將命令傳遞給test.exe,我該如何做到這一點? – ming

+0

謝謝,我想我知道問題出在哪裏。命名管道需要連接到作家和閱讀。在回聲「test」> MYPIPE的情況下,管道文件在回聲後關閉,因此讀者得到EOF,然後進入無限循環。除了使用「KEYIN ming