主題曲
(夜靜更深對朗月朗月清輝亮
行遍天涯離開家園沉痛看月亮
何堪天涯回首家鄉夜夜暗盼望
笑對朗月月光光照地塘上
照著歡暢團敘愉快溫暖處樂也洋洋)
遠處里隔阻千裏白雲晚望
想想想別離後寸心怎會不思鄉
每夜每朝抱愁眠悲痛流浪
故地故苑最是難忘空盼望啊
深秋滿地風霜最斷腸
(月亮光光月亮光光……)
(陣陣秋風送柳浪朗月光且亮
人去天涯萍蹤飄流何處有岸
離開妻兒懷想家鄉異地兩處望
笑對朗月月光光照地塘上
照著歡暢孩兒父母溫暖處樂也洋洋)
去去去去家千里夢回故鄉上
悲秋風獨流浪那堪飄泊嗟風霜
冷落痛心歲月無情飄泊流浪
哪日哪朝鳥倦還巢春柳岸啊
秋深倍念家鄉最斷腸
其它相關
僵死進程
一個進程在調用exit命令結束自己的生命的時候,其實它並沒有真正的被銷毀,而是留下一個稱為
殭屍進程(Zombie)的
數據結構(
系統調用exit,它的作用是使進程退出,但也僅僅限於將一個正常的進程變成一個殭屍進程,並不能將其完全銷毀)。在
Linux進程的狀態中,
殭屍進程是非常特殊的一種,它已經放棄了幾乎所有記憶體空間,沒有任何可執行代碼,也不能被調度,僅僅在進程列表中保留一個位置,記載該進程的退出狀態等信息供其他進程收集,除此之外,殭屍進程不再占有任何記憶體空間。它需要它的
父進程來為它收屍,如果他的父進程沒安裝SIGCHLD信號處理
函式調用wait或waitpid()等待子進程結束,又沒有顯式忽略該信號,那么它就一直保持殭屍狀態,如果這時父進程結束了,那么
init進程自動 會接手這個子進程,為它收屍,它還是能被清除的。但是如果如果
父進程是一個循環,不會結束,那么子進程就會一直保持殭屍狀態,這就是為什麼系統中有時會有很多的
殭屍進程。
怎么查看殭屍進程:
利用命令ps,可以看到有標記為Z的進程就是
殭屍進程。
怎樣來清除殭屍進程:
1.改寫
父進程,在子進程死後要為它收屍。具體做法是接管
SIGCHLD信號。子進程死後,會傳送SIGCHLD信號給
父進程,父進程收到此信號後,執行waitpid()函式為子進程收屍。這是基於這樣的原理:就算
父進程沒有調用wait,核心也會向它傳送SIGCHLD訊息,儘管對的默認處理是忽略,如果想回響這個訊息,可以設定一個處理函式。
2.把
父進程殺掉。
父進程死後,殭屍進程成為"孤兒進程",過繼給1號進程init,init始終會負責清理殭屍進程.它產生的所有殭屍進程也跟著消失。
在Linux中可以用
ps auwx
a all w/
tty, including other users 所有視窗和終端,包括其他用戶的進程
u user-oriented 面向用戶(用戶友好)
-w,w wide output 寬格式輸出
x processes w/o controlling
ttys
ps axf
ps axm
ps axu
顯示進程的詳細狀態
killall
kill -15
kill -9
一般都不能殺掉defunct進程
用了kill -15,kill -9以後 之後反而會多出更多的
殭屍進程kill -kill pid
可以考慮殺死他的parent process,
kill -9 他的parent process
=========================================
一個已經終止,但是其父進程尚未對其進行善後處理(獲取終止子進程的有關信息、釋放它仍占用的資源)的進程被稱為
僵死進程(
Zombie Process)。
避免zombie的方法:
1)在SVR4中,如果調用signal或sigset將SIGCHLD的配置設定為忽略,則不會產生僵死子進程。另外,使用SVR4版的sigaction,則可設定SA_NOCLDWAIT標誌以避免子進程僵死。
Linux中也可使用這個,在一個程式的開始調用這個函式
signal(SIGCHLD,SIG_IGN);
2)調用fork兩次。程式8 - 5 實現了這一點。
3)用waitpid等待子進程返回.
zombie進程是
僵死進程。防止它的辦法,一是用wait,waitpid之類的函式獲得
進程的終止狀態,以釋放資源。另一個是fork兩次
defunct進程只是在process table里還有一個記錄,其他的資源沒有占用,除非你的系統的process個數的限制已經快超過了,zombie進程不會有更多的壞處。
可能唯一的方法就是
reboot系統可以消除zombie進程。
任何程式都有殭屍狀態,它占用一點記憶體資源(也就是進程表里還有一個記錄),僅僅是表象而已不必害怕。如果程式有問題有機會遇見,解決大批量殭屍簡單有效的辦法是重起。kill是無任何效果的
fork與zombie/defunct"
在
Unix下的一些進程的運作方式。當一個進程死亡時,它並不是完全的消失了。進程終止,它不再運行,但是還有一些殘留的小東西等待
父進程收回。這些殘留的東西包括子進程的
返回值和其他的一些東西。當
父進程 fork() 一個子進程後,它必須用 wait() 或者 waitpid() 等待子進程退出。正是這個 wait() 動作來讓子進程的殘留物消失。
自然的,在上述規則之外有個例外:
父進程可以忽略 SIGCLD
軟中斷而不必要 wait()。可以這樣做到(在支持它的系統上,比如Linux):
main()
{
signal(SIGCLD, SIG_IGN); /* now I don't have to wait()! */
.
.
fork();
fork();
fork(); /* Rabbits, rabbits, rabbits! */
}
子進程死亡時
父進程 wait(),通常用 ps 可以看到它被顯示為“”。它將永遠保持這樣 直到
父進程 wait(),或者按以下方法處理。
必須知道的另一個規則:當
父進程在它wait()子進程之前死亡了(假定它沒有忽略 SIGCLD),子進程將把 init(pid 1)進程作為它的父進程。如果子進程工作得很好並能夠控制,這並不是問題。但如果子進程已經是defunct,原先的
父進程不可能再 wait(),因為它已經消亡了。這樣,init 怎么知道 wait() 這些 zombie 進程?
答案:在一些系統上,init周期性的破壞掉它所有的defunct進程。在另外一些系統中,它乾脆拒絕成為任何defunct進程的
父進程,而是馬上毀滅它們。如果使用上述系統的一種,可以寫一個簡單的循環,用屬於init的defunct進程填滿進程表。
任務:確定
父進程不要忽略 SIGCLD,也不要 wait() 它 fork() 的所有進程。不過,也未必要總是這樣做(比如,要起一個 daemon 或是別的什麼東西),但是必須小心編程。
鬼故事殭屍
在鬼故事中,殭屍通常都是裹著白布條,在棺材中或者太平間,有的屍體完整,有的破碎不堪,甚至腐敗,身體僵硬,行動緩慢,沒有意識,對付殭屍很難,幾乎沒辦法。