進程控制
學習目標
了解進程相關概念
掌握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
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
執行結果
[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
[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
[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小時內刪除侵權內容。