《操作系统》实验报告——熟悉Linux基础命令及进程管理
理論知識
Linux——進程管理
Linux——Linux C語言編程基礎知識
手把手教你安裝Linux虛擬機
一、實驗目的
(1)加深對進程概念的理解,明確進程和程序的區別。
(2)進一步認識并發執行的實質。
(3)分析進程爭用資源的現象,學習解決進程互斥的方法。
二、實驗內容
Liunx文件與目錄操作
- 顯示文件目錄命令ls
- 改變當前目錄命令cd
- 建立子目錄mkdir
- 刪除子目錄命令rmdir
- 刪除文件命令rm
- 文件改名命令mv
- 文件復制命令cp
- 顯示文件的內容more或者less
- 查找文件find
- 重定向與管道 |
進程管理
運行以下附錄部分中給出的程序,查看自己運行的結果,并進行分析。
1、寫出程序的運行結果,并分析為什么會得到這樣的結果。
2、畫出程序執行的進程樹并在相應的進程節點上標出進程號
編寫程序,要求見附錄部分
三、代碼及運行結果分析
Liunx文件與目錄操作
顯示文件目錄命令ls
改變當前目錄命令cd
建立子目錄mkdir
刪除子目錄命令rmdir
刪除文件命令rm??????????
文件改名命令mv
文件復制命令cp
顯示文件的內容more或者less
查找文件find
重定向與管道 |
進程管理
(1)運行源碼
運行上文進程管理中給出的例子,查看自己運行的結果,并進行分析。
程序1
?
程序2
程序3
程序4
程序5
程序6
程序7
(2)進程的創建
自己編寫一段程序,使用系統調用fork()創建子進程,認識進程的并發執行。
#include<stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdlib.h>int main(){pid_t pid;pid=fork();if(pid<0) /* 如果出錯 */printf("error occurred!\n");else if(pid==0) /* 如果是子進程 */{printf("我是子進程1,進程號是%d\n",getpid());pid_t pid1;pid1 = fork();if(pid1==0){printf("我是子進程1的子進程,進程號是%d\n",getpid());}}else{printf("我是父進程,進程號是%d\n",getpid());pid=fork();if(pid==0)printf("我是子進程2,進程號是%d\n",getpid());else{pid=fork();if(pid==0)printf("我是子進程3,進程號是%d\n",getpid());}}return 0;}(3)進程的同步
自己編寫一段程序,利用fork()、wait()等系統調用實現父子進程間的同步。
#include<stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdlib.h> int main() {int p1,p2,i;while((p1=fork())==-1);if(p1==0){lockf(1,1,0);for(i=0;i<50000; i++)printf("son%d\n",i);lockf(1,0,0);}else{while((p2=fork())==-1);if(p2==0){lockf(1,1,0);for(i=0;i<50000;i++)printf("daughter%d\n",i);lockf(1,0,0);}else{lockf(1,1,0);for(i=0;i<50000;i++)printf("parent%d\n",i);lockf(1,0,0);}}return 0; }?
附
(四個進程管理的程序)
程序1
#include "stdio.h" main() {int i,j,k; if (i=fork()) {j=wait(); printf("Parent Process!\n"); printf("i=%d,j=%d,k=%d\n",i,j); } else {k=getpid(); printf("Child Process!\n"); printf("i=%d,k=%d\n\n",i,k); } }?
使用fork()的進程是父進程,通過fork()建立的新進程是子進程。
fork()創建成功,返回值對子進程是0,對父進程是子進程的pid(一個正整數)。
在調用fork()后,父進程和子進程均從下一條語句開始執行。
wait()的功能是阻塞父進程,等待子進程完成后使得父進程繼續工作。
wait()的返回值是所等待的子進程的進程標識符。
getpid()返回調用進程的進程標識符,則輸出子進程的k與父進程的i,j相等。
輸出結果可能是:
Child Process! i=0,k=9351 Parent Process! i=9351,j=9351?
程序2
#include <stdio.h> main() { int p1,p2; long i; char c1; while ((p1=fork())==-1); if (p1==0) {c1='B';write(1,&c1,1);for( i=0;i<3000000;i++) ; c1='b';write(1,&c1,1); } else {while ((p2=fork())==-1);if (p2==0){c1='C';write(1,&c1,1);for( i=0;i<3000000;i++) ;c1='c';write(1,&c1,1);}else{c1='A';write(1,&c1,1);for( i=0; i<3000000; i++) ;c1='a';write(1,&c1,1);}} }用fork()創建兩個子進程,程序運行時,系統中有1個父進程和2個子進程活動。
每個進程在屏幕上顯示兩個字符,父進程顯示“A”和“a”。
write(1,&c1,1)的函數原型write(fd,buf,count):從buf所指向的內存中輸出count個字符的信息到fd所代表的文件中,fd為文件號,buf為一個地址,此處fd=1,代表的就是顯示屏,從地址&c1處輸出一個字符到屏幕上,就是顯示出c1,在每一個進程代碼中間都有循環語句起延時作用,能夠看出進程調度的效果。
為何不使用printf,printf經過緩沖,使用后,“A”和“a”會一次顯示出來,不會交錯顯示。
可能的輸出結果:AbbCca,AaBbCc,ABCcba等等。
程序3
main() {int m,n,k; m=fork(); printf("PID:%d\t",getpid()); printf("The return value of fork():%d\t\t",m); printf("hee\n"); n=fork(); printf("PID:%d\t",getpid()); printf("The return value of fork():%d\t\t",n); printf("ha\n"); k=fork(); printf("PID:%d\t",getpid()); printf("The return value of fork():%d\t\t",k); printf("ho\n"); }程序3的簡化
main(){ fork();printf(“hee\n”); fork();printf(“ha\n”); fork();printf(“ho\n”); }為了便于觀察,先打印出調用進程的進程標識符,而后是fork()的返回值。
若是
main(){ fork();printf(“hee\n”); }打印出
hee (父進程)hee (子進程)請大家上機抄下結果,畫出進程樹,在每一個進程結點邊上畫出標識符。
程序4
#include <stdio.h> main() { int i; if (fork()==0){for(i=0;i<10000;i++) printf(".......................\n"); } else {if (fork()==0){for( i=0; i<10000; i++)printf("#################\n");}else for (i=0;i<10000;i++)printf("******************\n"); } }程序4中也是3個進程。
程序5
#include<stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdlib.h> int main() {int p1,p2;while((p1=fork())==-1);if(p1==0)printf("b.My process ID is %d\n",getpid());else{while((p2=fork())==-1);if(p2==0)printf("c.My process ID is %d\n",getpid());else printf("a.My process ID is %d\n",getpid());}return 0; }程序6
#include<stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdlib.h> int main() { int m,n,k;m=fork();printf("PID:%d\t",getpid());printf("The return value of fork():%d\t\t",m);printf("he\n");n=fork();printf("PID:%d\t",getpid());printf("The return value of fork():%d\t\t",n);printf("ha\n");k=fork();printf("PID:%d\t",getpid());printf("The return value of fork():%d\t\t",k);printf("ho\n");return 0; }程序7
#include<stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdlib.h> int main() {int p1,p2,i;while((p1=fork())==-1);if(p1==0)for(i=0;i<50000; i++)printf("son%d\n",i);else{while((p2=fork())==-1);if(p2==0)for(i=0;i<50000;i++)printf("daughter%d\n",i);elsefor(i=0;i<50000;i++)printf("parent%d\n",i);}return 0; }四、實驗心得
(1)加深對進程概念的理解,明確進程和程序的區別。
(2)進一步認識并發執行的實質。
(3)分析進程爭用資源的現象,學習解決進程互斥的方法。
(4)復習課本關于進程控制和進程同步的內容,加深對進程管理概念的理解。
(5)認真閱讀實驗材料中進程管理部分,分析多個進程的運行情況。
參考文章
《操作系統》實驗報告——進程管理
lockf函數的使用
?
總結
以上是生活随笔為你收集整理的《操作系统》实验报告——熟悉Linux基础命令及进程管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《操作系统》实验报告——进程管理
- 下一篇: WSL——Linux C编程中lockf