Linux 編程之進(jìn)程fork()詳解及實(shí)例
Linux fork()詳解:
在開始之前,我們先來了解一些基本的概念:
1. 程序, 沒有在運(yùn)行的可執(zhí)行文件
進(jìn)程, 運(yùn)行中的程序
2. 進(jìn)程調(diào)度的方法:
按時(shí)間片輪轉(zhuǎn)
先來先服務(wù)
短時(shí)間優(yōu)先
按優(yōu)先級別
3. 進(jìn)程的狀態(tài):
就緒 ->> 運(yùn)行 ->> 等待
運(yùn)行 ->> 就緒 //時(shí)間片完了
等待 ->> 就緒 //等待的條件完成了
查看當(dāng)前系統(tǒng)進(jìn)程的狀態(tài) ps auxf
status:
D Uninterruptible sleep (usually IO)
R Running or runnable (on run queue)
S Interruptible sleep (waiting for an event to complete)
T Stopped, either by a job control signal or because it is being traced.
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z Defunct ("zombie") process, terminated but not reaped by its parent.
< high-priority (not nice to other users)
N low-priority (nice to other users)
L has pages locked into memory (for real-time and custom IO)
s is a session leader
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
+ is in the foreground process group
4. 父進(jìn)程/子進(jìn)程 , 讓一個(gè)程序運(yùn)行起來的進(jìn)程就叫父進(jìn)程, 被調(diào)用的進(jìn)程叫子進(jìn)程
5. getpid //獲取當(dāng)前進(jìn)程的進(jìn)程號
getppid //獲取當(dāng)前進(jìn)程的父進(jìn)程號
6. fork //創(chuàng)建一個(gè)子進(jìn)程,創(chuàng)建出來的子進(jìn)程是父進(jìn)程的一個(gè)副本, 除了進(jìn)程號,父進(jìn)程號不同。
子進(jìn)程從fork()后開始運(yùn)行, 它得到的fork返回值為0
父進(jìn)程得到的返回值為子進(jìn)程的進(jìn)程號
返回值為-1時(shí), 創(chuàng)建失敗
來看一個(gè)程序:
#include <stdio.h> #include <unistd.h> int main(void) { pid_t pid ; //printf("hello world \n"); //從fork開始就已經(jīng)產(chǎn)生子進(jìn)程 pid = fork(); //就已經(jīng)產(chǎn)生新的4G空間,復(fù)制空間 //創(chuàng)建出來的子進(jìn)程是父進(jìn)程的一個(gè)副本,除了進(jìn)程號,父進(jìn)程號和子進(jìn)程號不同 //printf("hello kitty\n"); if(pid == 0) { //子進(jìn)程運(yùn)行區(qū) printf("child curpid:%d parentpid:%d \n" , getpid() , getppid()); return 0 ; } //父進(jìn)程運(yùn)行區(qū) printf("parent curpid:%d parentpid:%d \n" , getpid() , getppid()); return 0 ; }
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- 詳解linux中fork、vfork、clone函數(shù)的區(qū)別
- Linux中fork()函數(shù)實(shí)例分析
- 使用C語言的fork()函數(shù)在Linux中創(chuàng)建進(jìn)程的實(shí)例講解
- 淺談Linux環(huán)境下并發(fā)編程中C語言fork()函數(shù)的使用
- Linux中使用C語言的fork()函數(shù)創(chuàng)建子進(jìn)程的實(shí)例教程
- C語言的fork函數(shù)在Linux中的進(jìn)程操作及相關(guān)面試題講解
- 簡單掌握Linux系統(tǒng)中fork()函數(shù)創(chuàng)建子進(jìn)程的用法
- Linux下C語言的fork()子進(jìn)程函數(shù)用法及相關(guān)問題解析
- Linux系統(tǒng)中C語言編程創(chuàng)建函數(shù)fork()執(zhí)行解析
- Linux 中fork的執(zhí)行的實(shí)例詳解
相關(guān)文章
linux shell 自定義函數(shù)方法(定義、返回值、變量作用域)
linux shell 可以用戶定義函數(shù),然后在shell腳本中可以隨便調(diào)用。下面說說它的定義方法,以及調(diào)用需要注意那些事項(xiàng)2014-09-09hi 感恩節(jié)——Linux基礎(chǔ)教程之mysql和php
這篇文章主要介紹了hi 感恩節(jié)——Linux基礎(chǔ)教程之mysql和php的相關(guān)資料,需要的朋友可以參考下2015-11-11Shell腳本實(shí)現(xiàn)監(jiān)控MySQL主從同步
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)監(jiān)控MySQL主從同步,此腳本應(yīng)該能適應(yīng)各種各樣不同的內(nèi)外網(wǎng)環(huán)境,并同時(shí)監(jiān)控MySQL運(yùn)行狀態(tài),需要的朋友可以參考下2015-01-01用expect實(shí)現(xiàn)ssh自動(dòng)登錄服務(wù)器并進(jìn)行批量管理的實(shí)現(xiàn)方法
這篇文章主要介紹用expect實(shí)現(xiàn)ssh自動(dòng)登錄服務(wù)器并進(jìn)行批量管理的實(shí)現(xiàn)方法,需要的朋友可以參考下2013-02-02Shell實(shí)現(xiàn)強(qiáng)制釋放內(nèi)存腳本分享
這篇文章主要介紹了Shell實(shí)現(xiàn)強(qiáng)制釋放內(nèi)存腳本分享,本文直接給出實(shí)現(xiàn)代碼,并對每一句代碼都做了講解了,需要的朋友可以參考下2015-02-02shell批量創(chuàng)建文件并重新命名的實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于shell批量創(chuàng)建文件并重新命名的相關(guān)資料,文中還介紹了批量刪除文件以及文件更名的多種方法,每種方法都給出了詳細(xì)實(shí)例代碼,需要的朋友可以參考下2021-07-07