2
我需要你的幫助!用管道執行命令並在C++中超時(並讀取標準輸出)
我做了一個報告deamon(在C++中),它需要定期在服務器上執行一堆命令。
一個簡單的例子命令將是:「/斌/ ps的輔助|的/ usr /斌/ WC -l」
第一個想法是叉與POPEN運行命令一個子進程(),並設置如果該命令尚未退出,則在父進程中發出警報()以在5秒後終止該子項。
我試過使用「sleep 20000」作爲命令,子進程被終止,但睡眠命令仍在運行......不好。
第二個想法是使用execlp()代替popen(),它使用簡單命令(即沒有管道),如「ls -lisa」或「sleep 20000」。我可以得到結果,如果5秒後沒有完成,這些進程將被終止。
現在我需要執行「/ bin/ps aux |/usr/bin/wc -l」命令,顯然它不會直接與execlp()一起工作,所以我嘗試了「破解」:
execlp("sh","sh","-c","/bin/ps aux | /usr/bin/wc -l",NULL);
我的作品...或者,所以我想......我想
execlp("sh","sh","-c","sleep 20000",NULL);
只是要確定和子進程後5秒(我的超時),但睡眠命令就停在那兒殺死...
我打開的建議(我會解決爲黑客)!
在此先感謝!
TLDR;
我需要一種方法來:
- 執行 「複雜」 的命令,比如 「/斌/ ps的輔助|在/ usr/bin中/ WC -l」
- 得到它的輸出
- 化妝知道它需要超過5秒鐘,它殺死了Coreutils的(ps命令只是和例子,實際的命令可能會永遠掛起)
謝謝!我目前無法測試,但當我回家時我會嘗試。 有一件事,儘管用我的解決方案殺死了子進程,但也殺死了「sh -c」,但不知何故,「sleep 20000」進程仍能保留下來。 – srsbsns
在推薦'timeout'之前,我測試了它並確保'sleep'也被終止。 –
'execlp(「timeout」,「timeout」,「5」,「sh」,「 - c」,「ls -lisa | grep etc」,NULL);' 它的作品,謝謝! – srsbsns