需要準備的知識點:
1. linux網絡編程,多線程,僵尸進程
2. 數據庫范式和基本sql語句
3. 項目
4. Select,poll
5. 在fork前加上信號處理函數:
signal(SIG_CHLD, Proc_CHLD);
void Proc_CHLD(int SIGNO)
{
int pid = -1;
int stat;
while(pid=waitpid(0, &stat, WHNONG);
}
6. MFC消息機制,文檔視圖模型,生死之謎
7. Pthread_join是等待線程結束。Wait和waitpid是獲取子進程的退出碼,防止僵尸進程長期存在
8. .僵尸進程解決辦法:
4.1 改寫父進程,在子進程死后要為它收尸。具體做法是接管SIGCHLD信號。子進程死后,會發送SIGCHLD信號給父進程,父進程收到此信號后,執行 waitpid()函數為子進程收尸。這是基于這樣的原理:就算父進程沒有調用wait,內核也會向它發送SIGCHLD消息,盡管對的默認處理是忽略,如果想響應這個消息,可以設置一個處理函數。
4.2 把父進程殺掉。父進程死后,僵尸進程成為"孤兒進程",過繼給1號進程init,init始終會負責清理僵尸進程.它產生的所有僵尸進程也跟著消失。
kill -9 `ps -ef | grep "Process Name" | awk '{ print $3 }'`
其中,“Process Name”為處于zombie狀態的進程名。
4.3 殺父進程不行的話,就嘗試用skill -t TTY關閉相應終端,TTY是進程相應的tty號(終端號)。但是,ps可能會查不到特定進程的tty號,這時就需要自己判斷了。
4.4 實在不行,重啟系統吧,這也是最常用到方法之一。
getpid() fork()的問題
fork()函數用于復制父進程,這個父進程是指當前進程嗎?
如果是當前進程,為什么我pid=fork()獲得的ID和pid=getpid()獲得的ID不一樣
pid=fork()與ppid=getppid()獲得的ID也不一樣
getpid()和getppid()也是分別獲得當前的ID和父ID首先你得理解一個fork調用會返回兩次,分別在父子進程中返回,并且返回值是不同的。
而fork以下的代碼如果不加控制,就會分別在父子進程里面都繼續執行下去。
要有效區分“當前”進程是父進程還是子進程的方法就是查看fork的返回值。
假如有一個進程,其pid為100,那么在這個進程來里面調用getpid()應該得到100。
接下來,該進程調用了fork(),產生了pid為101的子進程,那么
在原有的100進程(父)中,fork的返回值是101,也就是子進程的pid;
再次getpid()得到100,getppid()將得到祖父進程的pid,也就是既不是100,也不是101的其它值。
在新生的101進程(子)中,剛才產生了它本身的fork的返回值是0;
再次getpid()得到101,getppid()將得到100。
**的優勢:
**提供給客戶的不僅僅只是降低員工的需求,服務器綜合維護成本降低,安全,全球化,效率提升。
自己思考的優勢:還可以幫助游戲開發者,游戲開發團隊,游戲開發公司提升知名度,打造游戲開發者的品牌。舉例,開心農場的開發者實5分鐘公司,開心農場在中國風靡,幾乎人人皆知,但是很少有人知道開心農場是5分鐘公司開發的。比如在人人網上,很多人玩開心農場,喜歡上開心農場,很自然以后人人網出了其他游戲,很多人會因為喜歡開心農場而且玩人人上的游戲,這就是所謂的愛屋及烏。但是問題出現了,現在假如5分鐘公司出了一款新游戲,它沒有在人人上發布運營,本來很多人喜歡開心農場,按理會支持5分鐘公司的其他產品,但是由于5分鐘公司知名度不高,很多人不知道開心農場是5分鐘公司開發的,所以如果一旦5分鐘公司把自己的產品發布到其他平臺,就不一定有很多的受眾。所以對于游戲公司來說,要打造自己的核心品牌,要讓玩游戲的知道該游戲是自己公司開發的,之后,該公司發布游戲,就不用受制于運營商了。而**可以提供這個平臺,不僅給游戲公司提供sns連接平臺,更可以通過行云自己的平臺來發布他們的游戲,**可以只是作為游戲的發布平臺,游戲的所有者是游戲公司,從而幫助提高游戲開發公司的知名度。