操作系统课设之Linux 进程管理
前言
課程設計開始了,實驗很有意思,寫博客總結學到的知識
白嫖容易,創作不易,學到東西才是真
本文原創,創作不易,轉載請注明!!!
本文鏈接
個人博客:https://ronglin.fun/archives/173
PDF鏈接:見博客網站
CSDN: https://blog.csdn.net/RongLin02/article/details/118308366
為了美觀,實驗源代碼在結尾處,整合版見下
鏈接:https://pan.baidu.com/s/1rXj1QJGuw-BVc5sQWret9w
提取碼:Lin2
操作系統課程設計源代碼
本次操作系統課程設計合集
操作系統課設之Windows 進程管理
操作系統課設之Linux 進程管理
操作系統課設之Linux 進程間通信
操作系統課設之Windows 的互斥與同步
操作系統課設之內存管理
操作系統課設之虛擬內存頁面置換算法的模擬與實現
操作系統課設之基于信號量機制的并發程序設計
操作系統課設之簡單 shell 命令行解釋器的設計與實現
僅用于學習,如有侵權,請聯系我刪除
實驗題目
Linux 進程管理
實驗目的
通過進程的創建、撤銷和運行加深對進程概念和進程并發執行的理解,明確進程和程序之間的區別。
實驗內容
學習背景知識,了解Linux下的創建進程的方法。
由于操作系統的平時作業也是用Linux,再加上布置過在Linux下的C語言編程的作業,所以本驗證性實驗完成較為輕松
Linux環境:
虛擬機:Ubuntu 18.04 LTS;硬盤100G;內存4G;64位;4核心
Linux內核:5.11.8 開發工具:CodeBlocks
Linux虛擬機的安裝可以看我這兩篇博客:
https://blog.csdn.net/RongLin02/article/details/114273129
https://blog.csdn.net/RongLin02/article/details/115419994
原理:
主要涉及到兩個函數,一個是fork(),一個是exec()系列函數
fork 會建立一個子進程,父進程繼續運行,子進程在同樣的位置執行同樣的程序。fork()會分別返回兩個值給父子進程,fork()返回子進程的 pid給父進程,fork()返回 0給子進程。出錯時返回-1。 exec()函數會創建一個新的進程映象置換當前的進程映象。exec函數族的作用是根據指定的文件名找到可執行文件,并用它來取代調用進程的內容,換句話說,就是在調用進程內部執行一個可執行文件。這里的可執行文件既可以是二進制文件,也可以是任何Linux下可執行的腳本文件
在操作系統的平時作業中,我還用到了vfork()函數。因為fork()創建的子進程其實是父進程數據的copy,也就是說父子進程的數據并不是共享的,子進程只是父進程的翻版,類似于c語言函數中的傳遞形式參數,要想數據共享,其實也有很多方法,有些資料書上提到很多CLONE_開頭的標志位就是控制哪些東西是父子進程共享的。不過有更簡單的vfork()函數,其實本質上是一樣的,都是調用內核函數do_fork()。需要注意的是,不論多進程還是多線程,數據一旦共享,會涉及到安全問題,不過vfork()創建子進程之后,父進程就會阻塞,所以就沒安全問題了。
本驗證實驗不涉及到父子進程的數據傳遞
2-1 進程的創建
在Ubuntu下安裝好CodeBlocks,然后用CodeBlocks,創建一個新工程,將指導書的代碼copy到main.c文件中,然后編譯運行查看結果
多次運行,查看結果
關鍵代碼
2-2 子進程執行新任務
新建一個工程,將實例代碼copy到main.c下
運行查看結果
關鍵代碼
實驗結果與分析
2-1 進程的創建
這是幾次的運行的結果。
分析結果:
子進程輸出a和c,父進程輸出b和c,當fork()成功之后,將父進程的代碼copy一份給子進程運行,所以說父子進程都會輸出c,但是控制臺只有一個,父子進程會搶輸出,再加上一個隨機睡眠函數,所以就會出現不同的輸出結果。
2-2 子進程執行新任務
運行結果
子進程會執行execlp()調用ls命令,輸出當前的目錄結構,同時父進程因為用了wait(null),會自我阻塞,等待隨機一個進程結束,然后再執行。
Wait函數也有兩個,一個是wait(),另一個是waitpid(),后者比前者功能更強大。
小結與心得體會
由于操作系統平時作業的關系,我對于Linux系統也比較熟悉了,在Linux系統下的C/C++編程也比較熟悉,故完成本驗證實驗也很輕松。
平時作業我們曾完成過,Linux虛擬環境的安裝,Linux內核的編譯,Linux下的C語言的進程與線程編程,Linux下打印進程樹。
這些在我的博客主頁中都可以搜到
=w=
源代碼
2-1 進程的創建
#include <stdio.h> #include<time.h> #include <stdlib.h> #include <unistd.h>int main() {int x;srand((unsigned)time(NULL));while((x=fork())==-1);if (x==0){sleep(rand() % 2);printf("a");}else{sleep(rand() % 3);printf("b");}printf("c");return 0; }2-2 子進程執行新任務
#include <sys/types.h> #include<sys/wait.h> #include <stdio.h> #include <unistd.h>int main() {pid_t pid;/* fork a child process */pid = fork();if (pid < 0){/* error occurred */fprintf(stderr, "Fork Failed");return 1;}else if (pid == 0){/* 子進程 */execlp("/bin/ls","ls",NULL);}else /* 父進程 */{/* 父進程將一直等待,直到子進程運行完畢*/wait(NULL);printf("Child Complete\n");}return 0; }總結
以上是生活随笔為你收集整理的操作系统课设之Linux 进程管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript经典实例_一道前端经
- 下一篇: python列表输入10个数、并排序-我