系统编程__2__父子进程的创建和回收
系統(tǒng)編程
這里寫的是對于小白來說更多的了解系統(tǒng)編程的文章,有寫的不對的地方還懇請各位大佬指出錯(cuò)誤,小編一定會(huì)多多采納[手動(dòng)多謝]。
那么,上一次我們稍微了解了一下關(guān)于系統(tǒng)編程的一些主要內(nèi)容[沒有看到的童鞋還請去上一篇文章稍微復(fù)習(xí)一下噢]。
這節(jié)課,我們先來想一想,我們?yōu)槭裁匆獙W(xué)系統(tǒng)編程呢?原因很簡單,我們要充分的利用CPU的性能,CPU和我們?nèi)祟惒惶粯?#xff0c;我們?nèi)祟惔蠖鄶?shù)情況下,在同一時(shí)間,只能完成一件事,而CPU作為無數(shù)科學(xué)家的心血當(dāng)然不會(huì)這么簡單,CPU能夠同時(shí)進(jìn)行多個(gè)進(jìn)程,這里的進(jìn)程我們可以理解成任務(wù),再說的生動(dòng)形象一點(diǎn),就是CPU可以在做飯的時(shí)候同時(shí)可以洗衣服,那么這是怎么完成這一系列的操作呢,咳咳,這里我們不進(jìn)入深入了解,畢竟我們也是站在無數(shù)巨人的肩膀上進(jìn)行開發(fā)的嘛,我們需要知道的是,怎么調(diào)用接口函數(shù),使得CPU可以同時(shí)進(jìn)行多個(gè)任務(wù)。
介紹一下關(guān)于父子進(jìn)程和進(jìn)程的ID號(注意父子進(jìn)程只是進(jìn)程間的其中一種關(guān)系):有血緣關(guān)系的進(jìn)程(這里知道有這個(gè)概念就好,不必過于深究)
父進(jìn)程:我們調(diào)用fork這個(gè)函數(shù),創(chuàng)建出來的是子進(jìn)程,調(diào)用fork的進(jìn)程就是父進(jìn)程。
子進(jìn)程:fork產(chǎn)生的進(jìn)程。
ID號:每個(gè)進(jìn)程系統(tǒng)都會(huì)分配一個(gè)ID號,用來區(qū)分不同進(jìn)程。
重點(diǎn)來了,父子進(jìn)程的接口函數(shù):
進(jìn)程的創(chuàng)建:pid_t fork (void)返回值共有三種情況:>0 ;父進(jìn)程的返回值,此時(shí)返回值為創(chuàng)建成功的那個(gè)子進(jìn)程的ID號。=0;子進(jìn)程的返回值<0; 創(chuàng)建進(jìn)程失敗注意:1.fork函數(shù)與以往我們使用的函數(shù)不一樣,fork函數(shù)一次調(diào)用兩次返回,即父,子進(jìn)程各有一次返回值。2.fork函數(shù)調(diào)用之后父進(jìn)程與子進(jìn)程的操作是獨(dú)立的,原因是因?yàn)楫?dāng)調(diào)用fork函數(shù)之后,系統(tǒng)會(huì)向內(nèi)存生請一段和源碼相同大小的內(nèi)存空間,并將源碼完整的復(fù)制過去(相似度為99。9%),這段內(nèi)存用來運(yùn)行fork產(chǎn)生的子進(jìn)程,比如設(shè)置全局變量int a,在父進(jìn)程中有a=4 ,子進(jìn)程中a=3,則這段代碼中a同時(shí)有兩個(gè)值,父進(jìn)程中有a=4 ,子進(jìn)程中a=3 。和文件IO類似,進(jìn)程有著回收的步驟(這里只講父子進(jìn)程)。
在介紹進(jìn)程回收之前,我們還得了解了解cpu的調(diào)度策略:
首先,我們了解了解什么是孤兒進(jìn)程:
孤兒進(jìn)程:又稱僵尸進(jìn)程,對于父子進(jìn)程來說產(chǎn)生孤兒進(jìn)程的原因是,父進(jìn)程先于子進(jìn)程退出,導(dǎo)致子進(jìn)程無人回收,子進(jìn)程就 變成了孤兒進(jìn)程(重點(diǎn)) 進(jìn)程的組成:數(shù)據(jù)段,代碼段,進(jìn)程控制塊(PCB->process control block) 進(jìn)程控制塊:指的是系統(tǒng)中定義的一塊結(jié)構(gòu)體,該結(jié)構(gòu)體用于儲存進(jìn)程運(yùn)行時(shí)候的狀態(tài)信息。(這里的概念了解了解就行)我們再了解了解,孤兒進(jìn)程有什么壞處:
壞處1:孤兒進(jìn)程無法回收,占用cup內(nèi)存. 壞處2:孤兒進(jìn)程無法普通方法無法終止,可能造成像病毒一樣的視覺效果。進(jìn)程的退出:
退出進(jìn)程: void exit (int status);void _exit (int status);進(jìn)程的回收:
進(jìn)程回收:包含的頭文件:#include<sys/wait.h>pid_t wait (int * wstatus)返回值:成功, 返回回收的那個(gè)子進(jìn)程的ID號失敗: -1 ;參數(shù):wstatus -->用于保存進(jìn)程退出時(shí),狀態(tài)信息(包括退出值)exit退出的僅僅是一部分。pid_t waitpid (pid_t pid ,int * wstatus,int options);返回值:成功返回回收的子進(jìn)程的ID號失敗:-1 ;參數(shù):pid -->waitpid (-10002);//我要回收 進(jìn)程組ID為10002里的某個(gè)子進(jìn)程.waitpid (-1);//我要回收任意一個(gè)子進(jìn)程waitpid (0);//我要回收任意一個(gè)子進(jìn)程waitpid (20000)//我要回收ID號為20000的進(jìn)程options->WNOHANG //非阻塞等待(父進(jìn)程退出時(shí),若子進(jìn)程還沒結(jié)束,那么父進(jìn)程不阻塞等待,直接結(jié)束)。->阻塞等待在很多時(shí)候我們都需要知道各個(gè)進(jìn)程的ID號,比如,當(dāng)想要回收某個(gè)確定的進(jìn)程時(shí),所以由此引出獲取各個(gè)進(jìn)程的ID號的函數(shù),例:
pid_t getpid (void)返回值:當(dāng)前進(jìn)程ID號pid_t getppid(void)返回值:當(dāng)前父進(jìn)程ID號pid_t getgrp(void)返回值:當(dāng)前進(jìn)程所屬進(jìn)程組ID號下面介紹一下各種關(guān)于進(jìn)程退出時(shí)可以利用進(jìn)程退出值進(jìn)行判斷的宏定義(不用背,要用的時(shí)侯找出來用就行)
WIFEXITED(status)//如果子進(jìn)程正常退出,則該宏為真。 WEXITSTATUS(status)//如果子進(jìn)程正常退出,則該宏將獲取子進(jìn)程退出值。 WCOREDUMP(status)//如果子進(jìn)程被信號殺死且生成核心轉(zhuǎn)儲文件(core,dump),則該宏為真。 WTERMSIG (status)//如果子進(jìn)程被信號殺死,該宏獲取導(dǎo)致他死亡信號值 WIFSTOPPED(status)//如果子進(jìn)程被信號暫停,且option中 WUNTRACED已被設(shè)置,為真。 WSTOPSIG(status)//如果WIFSYOPPEN(status)為真,則該宏將獲取導(dǎo)致子進(jìn)程暫停的信號值。 WIFCONTINUED(status),如果子進(jìn)程被信號SIGONT重新置為就緒態(tài),該宏為真。總結(jié)
以上是生活随笔為你收集整理的系统编程__2__父子进程的创建和回收的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 启动马达接线实物图_星三角降压启动电路图
- 下一篇: idea2020.03打开项目注释变为显