2012-02-22 73 views
2

在我的公司,我看到使用killall -9來殺死守護進程,然後再次啓動它們。 (其實應該是killall -SIGKILL使用`killall -9服務器; ./server&`重新啓動unix服務 - 持久的問題?

我想向同事解釋,這不應該是我們重新啓動守護進程的方式。也許使用SIGINT符號,以便進程可以正確關閉或使用init.d腳本正確地重新啓動服務。

我們在C中編程,因此有什麼可能會發生的對系統不利的SIGKILL?顯然這個信號不能被這個進程捕獲,所以沒有內部信號處理程序可以做任何好的關閉處理,但是

  • 文件讀/寫緩衝區是否被正確刷新?
  • 動態內存是否會被正確回收?
  • 還有其他的例子嗎?

我能在這些問題的答案猜測,但沒有人知道答案?任何人都可以展示他們的Unix知識來幫助我嗎?用具體的知識武裝我可以提出更好的論點!

+1

當一個應用程序被殺時,無論如何,它被分配的任何內存都會被釋放。這並不是說應用程序不能在當時使用的某個OTHER服務/進程中觸發內存泄漏,但是通過malloc()等獲得的進程本身將被釋放並可重用。 – 2012-02-22 15:45:20

+0

@MarcB - 「這並不是說應用程序無法在當時使用的某些其他服務/進程中觸發內存泄漏」 - 相關。例如流程A'與流程B'初始化對話。流程B爲此對話分配內存,並且只有當流程A「終止」對話時纔會釋放內存。不幸的是,A得到了'kill -9'ed,B永遠不會解除分配。在課程結束前,B結束。 – ArjunShankar 2012-02-22 16:13:21

+0

謝謝Arjun和Marc B – 2012-02-23 10:30:25

回答

2

a。讀/寫緩衝區。這是一個簡單的實驗,希望能夠向你的同事「證明」異常終止是不好的。執行此perl腳本,而它在睡覺,kill -9它:

#!/usr/bin/perl 
open FILE, ">file.txt" or die $!; 
print FILE "This is it"; 
sleep 100; 
close FILE; 

在我的機器,file.txt是空的,如果我殺了之前「接近」 =>看起來像異常終止可能意味着數據的損失。更多關於這個問題的公認答案: What happens if I don't call fclose() in a C program?

b。 動態分配的內存被釋放。這基本上是程序存儲空間中的一塊內存,稱爲「堆」。該程序要求操作系統根據動態分配調整堆大小,操作系統知道該塊的限制。即使在程序的一個乾淨的exit上,如果它有內存泄漏,這個內存也會被回收。

+0

另外:http://partmaps.org/era/unix/award.html#uuk9letter – ArjunShankar 2012-02-22 16:41:47

+0

謝謝Arjun。我很確定這些,但很高興能夠進行同行評審。謝謝。 – 2012-02-23 10:32:13