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
我希望服務能夠接受「測試」,將其打印出來,然後等待下一次輸入,但是在第一次運行後,它會繼續打印無限次地進行「測試」,即使刪除它,也不會再次響應管道文件。
我做錯了什麼?
謝謝回答。你的解決方案在這個scanf/printf的情況下工作,但while()循環繼續運行。我真正的程序比簡單的scanf()複雜得多,因此我無法做到這一點。我希望有一個解決方案可以讓程序掛在那裏直到下一個命令發佈。除了名稱管道之外,你還有其他解決方案嗎?假設我只有一個二進制可執行文件test.exe,它需要鍵盤輸入並做相應的操作。現在我想讓test.exe運行後臺作爲服務並使用另一個程序將命令傳遞給test.exe,我該如何做到這一點? – ming
謝謝,我想我知道問題出在哪裏。命名管道需要連接到作家和閱讀。在回聲「test」> MYPIPE的情況下,管道文件在回聲後關閉,因此讀者得到EOF,然後進入無限循環。除了使用「KEYIN
ming