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