Linux - 進程的建立fork()

main函數的參數

圖片.png
argc 傳進的參數個數
argv :參數
注意:利用for循環打印char* argv[]
  for循環內部不能直接定義int i=0; 內置不對算法

[root@localhost 2020-03-19]# ls
main  main.c
[root@localhost  2020-03-19]# ./main
argc:1
argc[0]=./main  

[root@localhost  2020-03-19]# ./main hello world
argc:3
argc[0]=./main  
argc[1]=hello  
argc[2]=world  

[root@localhost  2020-03-19]# ./main "hello world"
argc:2
argc[0]=./main  
argc[1]=hello world

輸出緩衝區

緩衝區 加載 中止條件  /\n
當遇到n的時候,才把緩衝區的內容所有輸出
圖片.png
注意:exit(0) 與_exit(0)的區別 :
  _exit(0)  不會去刷新緩衝區,直接結束進程併發

進程建立fork()⭐

圖片.png

fork()後,會生成一個獨立的子進程,父進程fork()後會返回子進程的pid,子進程會返回0
(子進程與父進程的pid !=)函數

pid_t pid = fork();

建立(複製)的子進程會跳過建立他的fork(),避免進入死循環spa

圖片.png

父子進程之間的聯繫

尋找與記錄
PCB裏面有單獨的一部分 去記錄 當前節點的父進程ppid是誰,咱們很容易經過子進程去 尋找父進程;
因此能夠經過tid_t getppid(); 經過子id獲得父id

可是咱們應該怎麼去尋找父進程的子進程呢?操作系統

因此在子進程返回給父進程過程當中   記錄下兒子的pid
便於之後去查找本身的兒子
僅此一次機會記錄下來
指定哪一個進程執行

子進程和父進程是兩個進程
先執行誰取決於操做系統的調度算法 -併發執行 code

若是指明想要父子進程兩個進程之間誰去容許 運行
能夠利用:父進程會返回子進程pid 子進程返回0這一特性
使用這樣的blog

if(pis==0) ..子進程.. else ..父進程..

fork()練習

例題一

注意事項:第二次循環的時候父子進程都進行了fork複製,因此有3個A3個B
圖片.png進程

例題二

去掉n之後
緩衝區原本有的值也賦值了
AB | i=1
AB  AB |i=2
+AB |i=1
因此會出現4個A 4個B圖片

for(i=0;i<2;++i)
    {
        pit_t pid = fork();
        assert(-1 != pid);
        if(pid == 0)
        {
            printf("A ");
        }
        else
        {
            printf("B ");
        }
     }
例題三

因此是3個A
圖片.png內存

fork與內存

圖片.png
圖片.png
圖片.png
引入寫時拷貝技術:
圖片.png

相關文章
相關標籤/搜索