進程控制

      網友投稿 705 2025-04-04

      學習目標

      了解進程相關概念

      掌握fork/getpid/getppid函數的使用

      熟練掌握ps/kill命令的使用

      熟練掌握execl/execlp函數的使用

      說出什么是孤兒進程,什么是僵尸進程

      熟練掌握wait函數的使用

      熟練掌握waitpid函數的使用

      1、進程相關概念

      程序和進程

      程序:二進制文件,占用磁盤空間

      進程:啟動的程序

      所有的數據都在內存中

      需要占用更多的系統資源

      CPU,物理內存

      并行和并發

      Concurrent = Two Queues One Coffee Machine

      3、PCB

      [tester@TesterPC ~]$ ulimit -a

      4、進程的五種狀態

      2、進程控制

      FORK(2) Linux Programmer's Manual FORK(2) NAME fork - create a child process SYNOPSIS #include #include pid_t fork(void);

      data:初始化為非0全局變量 初始化為非0的static變量 bss:初始化為0全局變量 初始化為0的static變量 未初始化的變量 rodata:常量、只讀變量

      data:初始化為非0全局變量 初始化為非0的static變量 bss:初始化為0全局變量 初始化為0的static變量 未初始化的變量 rodata:常量、只讀變量

      回答問題:

      fork函數的返回值

      >0 ,父進程的返回值

      =0 ,子進程的返回值

      子進程創建成功之后代碼的執行位置

      父進程執行到哪,子進程就從哪開始執行

      父子進程的執行順序?

      不一定,誰搶到CPU誰就執行

      進程控制

      如何區分父子進程?

      通過fork函數的返回值

      Getpid/ getppid

      Getpid - 得到當前經常的PID

      Getppid - 得到當前進程的父進程的PID

      我發現平臺不同,執行的結果也不同?待理解是什么問題造成的???

      Linux 平臺: [master2@master2-server ProcessPro]$ gcc fork_demo001.c [master2@master2-server ProcessPro]$ ll total 48 -rwxrwxr-x 1 master2 master2 17592 Nov 26 15:03 a.out -rwxrwxr-x 1 master2 master2 17640 Nov 25 14:28 fork -rw-rw-r-- 1 master2 master2 1068 Nov 25 20:17 fork.c -rw-rw-r-- 1 master2 master2 584 Nov 26 15:00 fork_demo001.c [master2@master2-server ProcessPro]$ [master2@master2-server ProcessPro]$ [master2@master2-server ProcessPro]$ ./a.out Fork Befor i:0 Fork Befor i:1 Fork Befor i:2 Fork Befor i:3 這是父進程,進程ID:3362177 Fork After i:0 Fork After i:1 Fork After i:2 Fork After i:3 [master2@master2-server ProcessPro]$ 這是子進程,子進程ID:3362178,父進程ID:1 Fork After i:0 Fork After i:1 Fork After i:2 Fork After i:3 [master2@master2-server ProcessPro]$

      使用VS Code執行: [Running] cd "/home/master2/ProjectData/ProcessPro/" && gcc fork_demo001.c -o fork_demo001 && "/home/master2/ProjectData/ProcessPro/"fork_demo001 Fork Befor i:0 Fork Befor i:1 Fork Befor i:2 Fork Befor i:3 這是父進程,進程ID:3368039 Fork After i:0 Fork After i:1 Fork After i:2 Fork After i:3 Fork Befor i:0 Fork Befor i:1 Fork Befor i:2 Fork Befor i:3 這是子進程,子進程ID:3368045,父進程ID:1 Fork After i:0 Fork After i:1 Fork After i:2 Fork After i:3 [Done] exited with code=0 in 0.075 seconds

      循環創建多個子進程

      #include #include #include int main(int argc, const char *agrs[]) { pid_t pid; int num = 4; int count = 3; int i; for (i = 0; i < num; i++) { printf("Fork Befor i:%d\n", i); } for (i = 0; i < count; i++) { pid = fork(); if (pid == 0) { break; } } switch (i) { case 0: printf("這是第1個進程,子進程ID:%d 父進程ID:%d\n", getpid(), getppid()); break; case 1: printf("這是第2個進程,子進程ID:%d 父進程ID:%d\n", getpid(), getppid()); break; case 2: printf("這是第3個進程,子進程ID:%d 父進程ID:%d\n", getpid(), getppid()); break; default: break; } if (i == count) { printf("這是父進程,進程ID:%d \n", getpid()); } for (size_t i = 0; i < num; i++) { printf("Fork After i:%d\n", i); } return 0; }

      執行結果

      [master2@master2-server ProcessPro]$ ./a.out Fork Befor i:0 Fork Befor i:1 Fork Befor i:2 Fork Befor i:3 這是父進程,進程ID:3513910 Fork After i:0 Fork After i:1 Fork After i:2 Fork After i:3 [master2@master2-server ProcessPro]$ 這是第1個進程,子進程ID:3513911 父進程ID:1 Fork After i:0 Fork After i:1 Fork After i:2 Fork After i:3 這是第2個進程,子進程ID:3513912 父進程ID:1 Fork After i:0 Fork After i:1 Fork After i:2 Fork After i:3 這是第3個進程,子進程ID:3513913 父進程ID:1 Fork After i:0 Fork After i:1 Fork After i:2 Fork After i:3 [master2@master2-server ProcessPro]$

      解決父進程先執行結束后顯示錯亂的問題。將父進程執行的時間大于子進程

      #include #include #include int main(int argc, const char *agrs[]) { pid_t pid; int num = 4; int count = 3; int i; for (i = 0; i < num; i++) { printf("Fork Befor i:%d\n", i); } for (i = 0; i < count; i++) { pid = fork(); if (pid == 0) { break; } } switch (i) { case 0: printf("這是第1個進程,子進程ID:%d 父進程ID:%d\n", getpid(), getppid()); break; case 1: printf("這是第2個進程,子進程ID:%d 父進程ID:%d\n", getpid(), getppid()); break; case 2: printf("這是第3個進程,子進程ID:%d 父進程ID:%d\n", getpid(), getppid()); break; default: break; } if (i == count) { printf("這是父進程,進程ID:%d \n", getpid()); sleep(1); } for (size_t i = 0; i < num; i++) { printf("Fork After i:%d\n", i); } return 0; }

      [master2@master2-server ProcessPro]$ ./a.out Fork Befor i:0 Fork Befor i:1 Fork Befor i:2 Fork Befor i:3 這是父進程,進程ID:3518501 這是第1個進程,子進程ID:3518502 父進程ID:3518501 Fork After i:0 Fork After i:1 Fork After i:2 Fork After i:3 這是第2個進程,子進程ID:3518503 父進程ID:3518501 Fork After i:0 Fork After i:1 Fork After i:2 Fork After i:3 這是第3個進程,子進程ID:3518504 父進程ID:3518501 Fork After i:0 Fork After i:1 Fork After i:2 Fork After i:3 Fork After i:0 Fork After i:1 Fork After i:2 Fork After i:3 [master2@master2-server ProcessPro]$

      進程相關的命令

      Ps

      Ps -aux | grep "xxx"

      Ps -ajx | grep "xxx"

      Kill - 向指定的進程發送信號

      進程共享

      剛fork出來之后:

      兩個地址空間用戶區數據完全相同

      后續各自進行了不同的操作:

      各個進程的地址空間中的數據是完全獨立的。

      讀時共享(節省內存空間)

      寫時復制

      父子之間能否通過使用全局變量通信?

      答案:不能

      因為兩個進程間內存不能共享

      data:初始化為非0全局變量

      初始化為非0的static變量

      bss:初始化為0全局變量

      初始化為0的static變量

      未初始化的變量

      rodata:常量、只讀變量

      data:初始化為非0全局變量

      初始化為非0的static變量

      bss:初始化為0全局變量

      初始化為0的static變量

      未初始化的變量

      rodata:常量、只讀變量

      讀時共享,寫時復制,用實例驗證

      #include #include #include int main(int argc, const char *agrs[]) { pid_t pid; int num = 4; int count = 3; int i; int counter = 200; /* for (i = 0; i < num; i++) { printf("Fork Befor i:%d\n", i); } */ for (i = 0; i < count; i++) { pid = fork(); if (pid == 0) { break; } } switch (i) { case 0: printf("這是第1個進程,子進程ID:%d 父進程ID:%d\n", getpid(), getppid()); counter+=200; printf("---counter = %d\n", counter); break; case 1: printf("這是第2個進程,子進程ID:%d 父進程ID:%d\n", getpid(), getppid()); counter+=200; printf("---counter = %d\n", counter); break; case 2: printf("這是第3個進程,子進程ID:%d 父進程ID:%d\n", getpid(), getppid()); counter+=200; printf("---counter = %d\n", counter); break; default: break; } if (i == count) { printf("這是父進程,進程ID:%d \n", getpid()); counter+=800; printf("---counter = %d\n", counter); sleep(1); } /* for (size_t i = 0; i < num; i++) { printf("Fork After i:%d\n", i); } */ return 0; }

      [master2@master2-server ProcessPro]$ ./a.out 這是父進程,進程ID:3533218 ---counter = 1000 這是第1個進程,子進程ID:3533219 父進程ID:3533218 ---counter = 400 這是第2個進程,子進程ID:3533220 父進程ID:3533218 ---counter = 400 這是第3個進程,子進程ID:3533221 父進程ID:3533218 ---counter = 400 [master2@master2-server ProcessPro]$

      任務調度

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:excel表格怎樣拷貝到ppt中
      下一篇:Excel2013插入聯機圖片怎么操作?
      相關文章
      成人亚洲网站www在线观看| 亚洲午夜无码久久| 国产精品手机在线亚洲| 亚洲人成色4444在线观看| 亚洲人成片在线观看| 亚洲成AV人片久久| 亚洲美女精品视频| 亚洲综合色丁香麻豆| 亚洲视频2020| 亚洲国产精品热久久| 亚洲成AV人片在| 亚洲AV永久无码精品一百度影院| 伊人婷婷综合缴情亚洲五月| 亚洲综合另类小说色区色噜噜| 国产精品亚洲美女久久久| 国产亚洲情侣一区二区无码AV| 亚洲国产精品尤物yw在线 | 国产精品亚洲片在线| 国产成人无码综合亚洲日韩| 亚洲国产精品va在线播放| 无码乱人伦一区二区亚洲| 亚洲a在线视频视频| 亚洲人成电影福利在线播放| 久久精品亚洲精品国产色婷| 亚洲另类小说图片| 亚洲一区二区久久| 亚洲AV无码无限在线观看不卡| 色偷偷女男人的天堂亚洲网 | 亚洲精品动漫人成3d在线| 亚洲精品国产福利一二区| 国产中文在线亚洲精品官网| 国产国拍精品亚洲AV片 | 中国亚洲呦女专区| 亚洲成av人无码亚洲成av人| 亚洲国产av无码精品| 久久影视国产亚洲| 亚洲成AV人在线观看天堂无码| 亚洲欧洲日产国码久在线观看| 亚洲ts人妖网站| 亚洲精品色播一区二区| 亚洲精品国产电影|