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