2013-12-22 90 views
0

如何關閉C中的Linux程序我正在編輯一個腳本以擁有一個計時器,腳本只運行10秒鐘然後關閉。X秒後終止程序Linux C

我跑的線路是: ./startmerge

這是一個C語言代碼到我的所有服務器文件合併在一起,我下載了,但我只希望它運行10秒。

+0

常見的方法是使用看門狗定時器,作爲另一個進程運行。當你的腳本啓動,保存生成的PID - 然後讓看門狗盯緊,如果需要發送的終止信號。 –

+0

你想,如果還沒有完成什麼它應該在10秒內做會發生什麼呢? – Bandrami

+1

'報警(10)'是非常簡單的,雖然它可能不是你真的想要走的路。請注意,你需要寫一個小信號處理程序,因爲默認的處理方式是終止進程。 – Duck

回答

3

如果大部分的時間都花在計算與CPU(換句話說,如果在./startmerge 10秒未在IO花),那麼你要限制CPU的時間,所以使用setrlimit(2)系統調用與RLIMIT_CPU。在bash中,要在運行startmerge前使用其內置ulimit(調用系統調用setrlimit),見this answer,像

ulimit -t 10 

如果您startmerge不是CPU密集型的,要kill它10秒後,也許(見this

startmerge & ; pidof_startmerge=$! 
    sleep 10; kill $pidof_startmerge 

更重要的是,讓(約一sleep 1如循環十倍)

一個循環

如果您有權訪問startmerge的C源代碼,並且想要改進它,請先閱讀time(7)signal(7)。由於Duck評論,考慮alarm(2)setitimer(2)timer_create(2)並建立一個信號處理程序 - 例如,對於SIGALRMsigaction(2)(但不要忘記,信號處理程序僅限於呼叫異步信號安全函數;您可以在其中設置全局變量volatile sig_atomic_t並在外部測試該變量)。如果您startmerge有基於一些復系統調用像poll(2)(或舊select(2))一些event loop它甚至應該是簡單的,而Linux的具體timerfd_create(2)可能是非常有益的。

您可以在bash中捕獲SIGALRM,請參閱this

Advanced Linux Programming有一些與您的問題相關的章節。 Advanced Bash Programming Guide也是有用的閱讀。