![2023年操作系統(tǒng)實驗報告實驗四_第1頁](http://file4.renrendoc.com/view/4bbb8eb80f158bcae9d9370a31c4281b/4bbb8eb80f158bcae9d9370a31c4281b1.gif)
![2023年操作系統(tǒng)實驗報告實驗四_第2頁](http://file4.renrendoc.com/view/4bbb8eb80f158bcae9d9370a31c4281b/4bbb8eb80f158bcae9d9370a31c4281b2.gif)
![2023年操作系統(tǒng)實驗報告實驗四_第3頁](http://file4.renrendoc.com/view/4bbb8eb80f158bcae9d9370a31c4281b/4bbb8eb80f158bcae9d9370a31c4281b3.gif)
![2023年操作系統(tǒng)實驗報告實驗四_第4頁](http://file4.renrendoc.com/view/4bbb8eb80f158bcae9d9370a31c4281b/4bbb8eb80f158bcae9d9370a31c4281b4.gif)
![2023年操作系統(tǒng)實驗報告實驗四_第5頁](http://file4.renrendoc.com/view/4bbb8eb80f158bcae9d9370a31c4281b/4bbb8eb80f158bcae9d9370a31c4281b5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
實驗四:進程管理(二)實驗內(nèi)容:.編寫一個程序,打印進程的如下信息:進程標記符,父進程標記符,真實用戶ID,有效用戶|D,真實用戶組ID,有效用戶組IDo并分析真實用戶ID和有效用戶ID的區(qū)別。源代碼及結(jié)果:/include<stdltb.h>#tnclude<stdto.h>#include<untstd.h>intmain(){printf("progress:\nH);printf(MPID:%d\nM,getpid());printf(MPPID:%d\nH,getppid());printf(MUID:%d\nH,getuid());printf(EUID:%d\nM,geteutd());printf('GID:%d\nM,getgtd());printf(MEGID:%d\nn,getegid());)blank@blank-Vi.rtua'LBox:*$?progress:PID:3856PPID:1787UID:1000EUID:1O00GID:1000EGID:1O00blank@blank-VlrtualBox:一$真實用戶ID和有效用戶ID的區(qū)別:真實用戶ID:這個ID就是我們登陸unix系統(tǒng)時的身份IDo有效用戶ID:定義了操作者的權(quán)限。有效用戶ID是進程的屬性,決定了該進程對文獻的訪問權(quán)限。.閱讀如下程序,編譯并運營,分析進程執(zhí)行過程的時間消耗(總共消耗的時間和CPU消耗的時間),并解釋執(zhí)行結(jié)果。再編寫一個計算密集型的程序替代grep,比較兩次時間的花銷。注釋程序重要語句。/*叩rocessusingtime*/incIude<stdio.h>incIude<stdlib.h>#include<sys/times.h>#include<time.h>#incIude<unistd.h>#include<stdio.h>#include<stdlib.h>#include<sys/time.h>#tnclude<sys/resource.h>#include<untstd.h>main(){pid_tpid;intstatus;|pid=fork();if(ptd>0){〃在父進程中設(shè)置子進程優(yōu)先級setpriority(PRIO_PROCESS,ptd,15);prtntf(Hthepriorityofsonprocessis%d\nM,getpriortty(PRIO_PROCESS,pid));}一else{〃子迸程執(zhí)行shell命令find/-namehda*的功能execlp(Mfindn,?'find",H-nameH,whda*\(char*)6);exit(O);)wait(O);printf(Mchild[%d]terminated\nM,pid);exit(O);}程序運營結(jié)果:?O?user@ubuntu:~/usr/share/alsa/intt/hda/usr/src/linux-headers-3.2.0-54/inc'lude/sound/hda_hwdepehthepriorityofsonprocessis15child[4731]terminated(END)?00use「@ubuntu:?find:'/proc/3551/task/3551/ns1:權(quán)限不夠find:'/proc/3551/fd1:權(quán)限不夠find:'/proc/3551/fdinfo':權(quán)限不夠find:'/proc/3551/ns1:權(quán)限/夠find:'/proc/4364/task/4364/fd1:權(quán)限不夠find:'/proc/4364/task/4364/fdinfo*:權(quán)俊不筋find:'/proc/4364/task/4364/ns,:權(quán)限/夠find:'/proc/4364/fd1:權(quán)限不夠find:'/proc/4364/fdinfo':權(quán)限不夠find:'/proc/4364/ns1:權(quán)限木夠find:%/proc/4383/task/4383/fd,:權(quán)限不夠find:'/proc/4383/task/4383/fdinfo1:權(quán)限不夠find:'/proc/4383/task/4383/ns1:權(quán)限/夠find:'/proc/4383/fd1:權(quán)限不夠find:'/proc/4383/fdinfo':權(quán)限不夠find:'/proc/4383/ns1:權(quán)限不夠find:'/proc/4646/task/4646/fd1:權(quán)限不夠find:'/proc/4646/task/4646/fdinfo,:權(quán)限不夠find:'/proc/4646/task/4646/ns1:權(quán)限/夠find:'/proc/4646/fd1:權(quán)限不夠find:'/proc/4646/fdinfo':權(quán)限不夠find:'/proc/4646/ns1:權(quán)限不夠find:'/root1:權(quán)限不夠find:'/sys/fs/fuse/connections/191:權(quán)限不夠find:'/sys/kernel/debug1:權(quán)限不夠thepriorityofsonprocessis15child[4731]terminated./**編寫程序,規(guī)定父進程創(chuàng)建一個子進程,子進程對一個50*50的字符數(shù)組賦值,由父進程改變子進程的優(yōu)先級,觀測不同優(yōu)先級進程使用CPU的時間。*/.查閱Linux系統(tǒng)中structtask_struct的定義,說明每項成員的作用。a注:searchin/usr/src/linux-2.6/incIude/linux/sched.h廣義上,所有的進程信息被放在一個叫做進程控制塊的數(shù)據(jù)結(jié)構(gòu)中,可以理解為進程屬性的集合。每個進程在內(nèi)核中都有一個進程控制塊(PCB)來維護進程相關(guān)的信息,Linux內(nèi)核的進程控制塊是task_struct結(jié)構(gòu)體。task_struct是Linux內(nèi)核的一種數(shù)據(jù)結(jié)構(gòu),它會被裝載到RAM里并且包含著進程的信息。每個進程都把它的信息放在task_struct這個數(shù)據(jù)結(jié)構(gòu)里,task_st「uct包含了這些內(nèi)容:(1)標示符:描述本進程的唯一標示符,用來區(qū)別其他進程。⑵狀態(tài):任務(wù)狀態(tài),退出代碼,退出信號等。a(3)優(yōu)先級:相對于其他進程的優(yōu)先級。49)程序計數(shù)器:程序中即將被執(zhí)行的下一條指令的地址。(5)內(nèi)存指針:涉及程序代碼和進程相關(guān)數(shù)據(jù)的指針,尚有和其他進程共享的內(nèi)存塊的指針。(6)上下文數(shù)據(jù):進程執(zhí)行時解決器的寄存器中的數(shù)據(jù)。(7)I/O狀態(tài)信息:涉及顯示的I/0請求,分派給進程的1/0設(shè)備和被進程使用的文獻列表。a(8)記賬信息:也許涉及解決器時間總和,使用的時鐘數(shù)總和,時間限制,記賬號?!觥觥觥觥觥霰4孢M程信息的數(shù)據(jù)結(jié)構(gòu)叫做task_struet,并且可以在inc1ude/Iinux/sched.h里找到它。A所有運營在系統(tǒng)里的進程都以task.struct鏈表的形式存在內(nèi)核里。進程的信息可以通過/proc系統(tǒng)文獻夾查看。task_struct一些字段的介紹:.調(diào)度數(shù)據(jù)成員(1)voIatilelongstates;表達進程的當前狀態(tài)2)unsigned1ongflags;進程標志33)Iongpriority冷進程優(yōu)先級。優(yōu)先級可通過系統(tǒng)調(diào)用sys_setpriorty改變。unsigned1ongrt_priority;Art_priority給出實時進程的優(yōu)先級,rt_priority+1000給出進程每次獲取CPU后可使用的時間(同樣按jiffies計)。實時進程的優(yōu)先級可通過系統(tǒng)調(diào)用sys_sched_setscheduIer()改變(見kerne1/sched.c)。Iongcounter;在輪轉(zhuǎn)法調(diào)度時表達進程當前還可運營多久。在進程開始運營是被賦為priority的值,以后每隔一個tick(時鐘中斷)遞減1,減到0時引起新一輪調(diào)度。重新調(diào)度將從run_queue隊列選出counter值最大的就緒進程并給予CPU使用權(quán),因此counter起到了進程的動態(tài)優(yōu)先級的作用(priority則是靜態(tài)優(yōu)先級)。unsignedIongpoIicy;該進程的進程調(diào)度策略,可以通過系統(tǒng)調(diào)用sys_sched_setscheduler()更改(見kernel/schecLc)。調(diào)度策略有:a?SCHED_OTHER0非實時進程,基于優(yōu)先權(quán)的輪轉(zhuǎn)法(「。undrobin)o^?sCHED_FIFO1實時進程,用先進先出算法。a?SCHED_RR2實時進程,用基于優(yōu)先權(quán)的輪轉(zhuǎn)法。號解決a(1)unsignedIongsignaI;進程接受到的信號。每位表達一種信號,共32種。置位有效。⑵unsignedlongblocked泠進程所能接受信號的位掩碼。置位表達屏蔽,復(fù)位表達不屏蔽。structsignaI_struct*sig;由于signa1和bIocked都是32位的變量,Linux最多只能接受32種信號。對每種信號,各進程可以由PCB的sig屬性選擇使用自定義的解決函數(shù),或是系統(tǒng)的缺省解決函數(shù)。指派各種信息解決函數(shù)的結(jié)構(gòu)定義在include/linux/sched.h中。對信號的檢查安排在系統(tǒng)調(diào)用結(jié)束后,以及“慢速型”中斷服務(wù)程序結(jié)束后(IRQ#_interrupt()o幺.進程隊列指針a(l)structtask_struet*next_task,*prev_task;所有進程(以PCB的形式)組成一個雙向鏈表。next_task和就是鏈表的前后指針。鏈表的頭和尾都是init_task(即0號進程)。2(a)structtask_struct*next_run,*prev_run;由正在運營或是可以運營的,其進程狀態(tài)均為TASK_RUNNING的進程所組成的一個雙向循環(huán)鏈表,即run_queue就緒隊列。該鏈表的前后向指針用nextn和prev_run,鏈表的頭和尾都是inittask(即。號進程)。structtask_struct*p—opptr,*p_pptr;和structtask_struct*p_cptr,*p_ysptr,*p_ospt「泠以上分別是指向原始父進程(originalparent)x父進程(parent)、子進程(youngestchild)及新老兄弟進程(youngersibIing,oldersibling)的指針。a4.進程標記(1)unsignedshortuid,gid;uid和gid是運營進程的用戶標記和用戶組標記。2(a)intgroups[NGROUPS]泠與多數(shù)現(xiàn)代UNIX操作系統(tǒng)同樣,Linux允許進程同時擁有一組用戶組號。在進程訪問文獻時,這些組號可用于合法性檢查。3(a)unsignedshorteuid,egid;aeuid和egid又稱為有效的uid和gid。出于系統(tǒng)安全的權(quán)限的考慮,運營程序時要檢查euid和egid的合法性。通常,uid等于euid,gid等于egid。有時候,系統(tǒng)會賦予一般用戶暫時擁有r。ot的uid和gid(作為用戶進程的euid和egid),以便于進行運作。a(4)unsignedshortfsuid,fsgid;fsuid和fsgid稱為文獻系統(tǒng)的uid和gid,用于文獻系統(tǒng)操作時的合法性檢查,是Linux獨特的標記類型。它們一般分別和euid和egid一致,但在NFS文獻系統(tǒng)中NFS服務(wù)器需要作為一個特殊的進程訪問文獻,這時只修改客戶進程的fsuid和fsgIdo⑸unsignedshortsuid,sgid;asuid和sgid是根據(jù)POSIX標準引入的,在系統(tǒng)調(diào)用改變uid和gid時,用于保存真正的uid和gid。intpid,pgrp,session;進程標記號、進程的組織號及session標記號,相關(guān)系統(tǒng)調(diào)用(見程序kernel/sys.c)有sys_setpgidxsys_getpgid、sys_setpgrp、sys_getpgrpxsys_getsid及sys_setsid幾種。intleader;^是否是session的主管,布爾量。5A.時間數(shù)據(jù)成員(1)unsignedlongtimeout泠用于軟件定期,指出進程間隔多久被重新喚醒。采用tick為單位。2(a)unsignedIongit_reaI_vaIue,it_real_iner;用于itimer(interva1timer)軟件定期。采用jiffies為單位,每個tick使it_reaI—value減到。時向進程發(fā)信號SIGALRM,并重新置初值。初值由it—reaI—incr保存。具體代碼見kernel/itimer.c中的函數(shù)it_real_fn()o(3)structtimer_Iistrea1—timer;一種定期器結(jié)構(gòu)(Linux共有兩種定期器結(jié)構(gòu),另一種稱作oldjimer)。數(shù)據(jù)結(jié)構(gòu)的定義在incIude/1inux/timer.h中,相關(guān)操作函數(shù)見kernel/sched.c中add_time1()和del_timer()等。4(a)unsignedlongit_virt_vaIue,it_virt_incr泠關(guān)于進程用戶態(tài)執(zhí)行時間的itimer軟件定期。采用jiffies為單位。進程在用戶態(tài)運營時,每個tick使it_virevalue減1,減至lj0時向進程發(fā)信號SIGVTALRM,并重新置初值。初值由it_virt_incr保存。具體代碼見kernel/sched.c中的函數(shù)do_it_virt()o(5)unsignedlongit_prof_value,it_prof_incr;同樣是itimer軟件定期。采用jiffies為單位。不管進程在用戶態(tài)或內(nèi)核態(tài)運營,每個tick使it_prof_value減1,減至lj0時向進程發(fā)信號SIGPROF,并重新置初值。初值由it_prof_incr保存。具體代碼見kernel/sched.c中的函數(shù)do_it_prof。(6)1ongutime,stime,cutime,cstime,start_time;以上分別為進程在用戶態(tài)的運營時間、進程在內(nèi)核態(tài)的運營時間'所有層次子進程在用戶態(tài)的運營時間總和、所有層次子進程在核心態(tài)的運營時間總和,以及創(chuàng)建該進程的時間。信號量數(shù)據(jù)成員structsem_undo*semundo泠進程每操作一次信號量,都生成一個對本次操作的undo操作,它由sem_undo結(jié)構(gòu)描述。這些屬于同一進程的undo操作組成的鏈表就由semundo屬性指示。當進程異常終止時,系統(tǒng)會調(diào)用undo操作。sem_undo的成員semadj指向一個數(shù)據(jù)數(shù)組,表達各次undo的量。結(jié)構(gòu)定義在include/linux/sem.h。2(a)structsem_queue*semsleepin每一信號量集合相應(yīng)一個sem_queue等待隊列(J41include/Iinux/sem.h)o進程因操作該信號量集合而阻塞時,它被掛到semsleeping指示的關(guān)于該信號量集合的sem—queue隊列。反過來,semsIeeping。sleeper指向該進程的PCB。7.進程上下文環(huán)境4(1)structdesc_struct*ldt;進程關(guān)于CPU段式存儲管理的局部描述符表的指針,用于仿真WINEWindows的程序。其他情況下取值NULL,進程的Idt就是arch/i386/traps.c定義的default」dt。structthread_structtssM壬務(wù)狀態(tài)段,其內(nèi)容與INTEl_CPU的TSS相應(yīng),如各種通用寄存器CPU調(diào)度時,當前運營進程的TSS保存到PCB的tss,新選中進程的tss內(nèi)容復(fù)制到CPU的TSSo結(jié)構(gòu)定義在incIude/linux/tasks,h中。a(3)unsigned1ongsaved_kernel_stack凈為MS-DOS的仿真程序(或叫系統(tǒng)調(diào)用vm86)保存的堆棧指針。a(4)unsignedlongkerne1_stack_page;在內(nèi)核態(tài)運營時,每個進程都有一個內(nèi)核堆棧,其基地址就保存在kernel_stack_page中。必.文獻系統(tǒng)數(shù)據(jù)成員(1)struetfs_struct*fs;afs保存了進程自身與VFS的關(guān)系消息,其中root指向根目錄結(jié)點,pwd指向當前目錄結(jié)點,umask給出新建文獻的訪問模式(可由系統(tǒng)調(diào)用umask更改),count是Linux保存的屬性,如下頁圖所示。結(jié)構(gòu)定義在include/linux/sched.h中。structfiles_struct*files;files包含了進程當前所打開的文獻(structfile*fd[NR_OPEN])。在Linux中,一個進程最多只能同時打開NR_OPEN個文獻。并且,前三項分別預(yù)先設(shè)立為標準輸入、標準輸出和犯錯消息輸出文獻。intlink_count;c文獻鏈(link)的數(shù)目。Array.內(nèi)存數(shù)據(jù)成員a(1)structmm_struet*mm;a在1inux中,采用按需分頁的策略解決進程的內(nèi)存需求。task_struct的數(shù)據(jù)成員mm指向關(guān)于存儲管理的mm_struct結(jié)構(gòu)。其中包含了一個虛存隊列mmap,指向由若干vm_area_struct描述的虛存塊。同時,為了加快訪問速度,mm中的mmap_avl維護了一個AVL樹。在樹中,所有的vm_area_struct虛存塊均由左指針指向相鄰的低虛存塊,右指針指向相鄰的高虛存塊。結(jié)構(gòu)定義在incIude/linux/sched.h中。voidtime_print(char*,clock_t);intmain(void){〃取得進程運營相關(guān)的時間eclocktstart,end;structtmst_start,t_end;start=times(&t_start);。system("grepthe/us「/doc/*/*>/dev/nuI12〉/dev/nuH");/"command>/dev/nulI的作用是將是command命令的標準輸出丟棄,而標準錯誤輸出還是在屏幕上。一般來講標準輸出和標準錯誤輸出都是屏幕,因此錯誤信息還是會在屏幕上輸出。>/dev/nu1I2>/dev/nu1I標準輸出與標準錯誤輸出都會被丟棄*///012標準輸入標準輸出錯誤輸出//>將信息放到該文獻nuI1中nd=times(&t_end);otime_printf'elapsed'end—start);叩uts("parenttimes");“time_print(叭tuserCPU”,匚end.tms_utime);time_print(“\tsysCPU”,t_end.tms_stime);gputs("childtimes");time_print(6C\tuserCPU",t_end.tmscutime);time_print("\tsysCPU“J_end.tms_cstime);exit(EXIT_SUCCESS);
voidtime_print(chartr,clock_ttime)Iongtps=sysconf(_SC_CLK_TCK);/*函數(shù)syscon千()的作用為將時鐘滴答數(shù)轉(zhuǎn)化為秒數(shù),—SC_CLK_TCK為定義每秒鐘有多少個滴答的宏興/printf("%s:%6,2fsecs'rT,str,(fIoat)time/tps);)程序運營結(jié)果:/Include#include#include#include/Include<stdto.h>/Include#include#include#include/Include<stdto.h><stdltb.h><sys/ttmes.h><ttme.h><untstd.h>voidtime_print(char*,clock_t);tntmatn(){clock_tstart,end;structtmst_start,tend;start=ttmes(&t_start);system("grepthe/usr/doc/*/*>/dev/null2>/dev/null");end=times(&t_end);time_prtnt("elapsed",end-start);puts("parenttimes");ttme_prtnt("\tuserCPUH,t_end.tms_utime);time_prtnt(M\tsysCPU",t_end.tms_sttme);puts("childtimes0);time_print("\tuserCPU,',t_end.tms_cutime);time_prtnt(H\tsysCPU",t_end.tms_cstime);extt(EXIT_SUCCESS);voidtine_prtnt(char*str,clock_tttme){longtps=sysconf(_SC_CLK_TCK);prtntf("%s:%6.2fsecs\n",str,(float)time/tps);C-制表符寬度:8^第20行,第1列▼插入文件(F)編輯(E)查看(V)搜索(S)終端(T)幫助(H)blank@blank-VirtualBox:~$gcc4-2.c-o4-2blank@blank-VirtualBox:-$~/4-2elapsed:0.O8secsparenttimesuserCPU:O.OOsecssysCPU:O.OOsecschildtimesuserCPU:O.OOsecssysCPU:O.OOsecsblank@blank-VirtualBox:?/4-2elapsed:0.21secsparenttimesuserCPU:0.00secssysCPU:O.OOsecschildtimesuserCPU:O.OOsecssysCPU:O.Olsecsblank@blank-VirtualBox:~$?/4?2elapsed:O.OlsecsparenttimesuserCPU:O.OOsecssysCPU:O.OOsecschildtimesuserCPU:O.OOsecssysCPU:O.OOsecsblank@blank-VirtualBox:**$?/4?2由于該程序計算量很小,故消耗的時間比較少,CPU消耗時間均為0.OOsecs局限性為奇。而進程的執(zhí)行時間等于用戶CPU時間和系統(tǒng)CPU時間加從硬盤讀取數(shù)據(jù)時間之和。密集型的程序替代grep:#include<stdio.h>又件(F)編輯(E)查看(V)搜索(S)終端(T)幫助(H)#include<stdlib.h>499][438]=937a[499][439]=938a[499][440]=939a[#tnclude<sys/ttmes.h>499][441]=940a[499][442]=941a[499][443]=942a[#include<ttme.h>499][444]=943a[499][445]=944a[499][446]=945a[/Include<unistd.h>499][447]=946a[499][448]=947a[499][449]=948a[voidtime_print(char*,clock_t);499][450]=949a[499][451]=950a[499][452]=951a[intmain(){499][453]=952a[499][454]=953a[499][455]=954a[clock_tstart,end;499][456]=955a[499][457]=956a[499][458]=957d[structtmst_start,t_end;499][459]=958a[499][460]=959a[499][461]=960a[start=times(&t_start5;499][462]=961a[499][463]=962a[499][464]=963a[intm=50O,n=5O0,i,j;499][465]=964a[499][466]=965a[499][467]=966a[inta[5O0][50O];499][468]=967a[499][469]=968a[499][470]=969a[for(i=0;499][471]=970a[499][472]=971a[499][473]=972a[for(j=0;j<n;j++)499][474]=973a[499][475]=974a[499][476]=975a[499][477]=976a[499][478]=977a[499][479]=978a[}499][480]=979a[499][481]=980a[499][482]=981d[for(i=0;i<m;i++){499][483]=982a[499][484]=983a[499][485]=984a[for(j=0;j<n;j++)499][486]=985a[499][487]=986a[499][488]=987a[printf(*'a[%d][%d]=%d\tn,i,j,a[i][j]);j499][489]=988a[499][490]=989a[499][491]=990a[prtntf(n\n");499][492]=991a[499][493]=992a[499][494]=993d[}499][495]=994a[499][496]=995a[499][497]=996a[end=times(&t_end);499][498]=997a[499][499]=998time_print("elapsed",end-start);elapsed:1.77secsputs("parenttimes'*);parenttimestime_print(H\tuserCPU",t_end.tms_utime);userCPU:0.04secstime_print("\tsysCPU",t_end.tms_stime);sysCPU:0.24secsputs("chlldtimes");childtimestime_print(H\tuserCPU",t_end.tms_cutime);userCPU:O.OOsecstime_print(H\tsysCPU",t_end.tms_cstime);sysCPU:0.O0secsextt(EXIT_SUCCESS);blank@blank-VirtualBox>-$J||)更改為計算密集型的之后就較容易觀測出消耗時間的差異。3.閱讀下列程序,編譯并多次運營,觀測執(zhí)行輸出順序,說明順序相同(或不同)的因素;觀測進程ID,分析進程ID的分派規(guī)律??偨Y(jié)fork()的使用方法。注釋程序重要語句。/*forkusage*/#include<unistd,h>#incIude<stdio.h>#include<stdlib.h>intmain(void)(pid_tchild;“f((child=fork0)=—1){8。perror("fork”);oexit(EXIT_FAILURE);。}elseif(chiId==0){8puts("inchild");3printf(“\tchildpid=%d\n':getpid());。叩rintff\tchildppid=%d\n”,getppid());“exit(EXIT_SUCCESS);}else{gputs(“inparent");eprintf("\tparentpid=%d\n,9,getpid());。。printf("\tparentppid=%d\n",getppid());00}8exit(EXIT_SUCCESS);程序運營結(jié)果:user@ubuntu:~$~/4?3inparentparentpid=2872parentppid=2680inchildchildpid=2873childppid=1use「@ubuntu:~$user@ubuntu:~$~/4?3inparentparentpid=2874parentppid=2680Inchildchildpid=2875childppid=1user@ubuntu:~$~/4?3inparentparentpid=2876parentppid=2680inchildchildpid=2877childppid=1user@ubuntu:-$~/4-3inparentparentpid=2879parentppid=2680inchildchildpid=2880childppid=1use「@ubuntu:~$~/4-3(?)創(chuàng)建進程ID開始時一般隨機分派,但若多次運營,或創(chuàng)建子進程時,會順序分派內(nèi)存。此外,當父進程結(jié)束時,子進程尚未結(jié)束,則子進程的父進程ID變?yōu)閘oMork()函數(shù)的實質(zhì)是一個系統(tǒng)調(diào)用(和write函數(shù)類似),其作用是創(chuàng)建一個新的進程,當一個進程調(diào)用它,完畢后就出現(xiàn)兩個幾乎一模同樣的進程,其中由fork()創(chuàng)建的新進程被稱為子進程,而本來的進程稱為父進程。子進程是父進程的一個拷貝,即子進程從父進程得到了數(shù)據(jù)段和堆棧的拷貝,這些需要分派新的內(nèi)存;而對于只讀的代碼段,通常使用共享內(nèi)存方式進行訪問。4.閱讀下列程序,編譯并運營,等待或者按人C,分別觀測執(zhí)行結(jié)果并分析,注釋程序重要語句。flag有什么作用?通過實驗說明。/*usageofkiI1,signal,wait*/include<unistd.h>include<stdio.h>include<sys/types.h>include<signal.h>intflag;voidstop();//自定義函數(shù),使flag=O,供signal調(diào)用intmain(void){“ntpidl,pid2;signal(3,stop);//signaI()依參數(shù)3指定的信號編號來設(shè)立該信號的解決函數(shù)while((pid1=fork())==-1);〃程序等待成功創(chuàng)建子進程事件的發(fā)生if(pidl>0){〃當前進程為父進程owhiIe((pid2=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2031年中國茶制床墊行業(yè)投資前景及策略咨詢研究報告
- 2025至2031年中國石榴干紅葡萄酒行業(yè)投資前景及策略咨詢研究報告
- 2025年油壓壓彎床項目可行性研究報告
- 2025年有色金屬連桿項目可行性研究報告
- 2025年攪拌機攪拌臂項目可行性研究報告
- 2025年小體視棱鏡項目可行性研究報告
- 2025至2031年中國內(nèi)置式伺服放大器模塊行業(yè)投資前景及策略咨詢研究報告
- 2025年沖裁拉伸模具項目可行性研究報告
- 2025至2030年中國雞藥數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年香油紅尖椒項目投資價值分析報告
- 2025年酒店總經(jīng)理崗位職責(zé)與薪酬協(xié)議
- 綠色能源項目融資計劃書范文
- 大樹扶正施工方案
- 2024年全國職業(yè)院校技能大賽中職組(母嬰照護賽項)考試題庫(含答案)
- 課題申報參考:全齡友好視角下的社區(qū)語言景觀評估及空間優(yōu)化研究
- 五年級下冊語文四大名著常考知識點
- 2024年上海普陀區(qū)司法局招聘人民調(diào)解員考試真題
- 光伏發(fā)電項目施工組織設(shè)計方案及技術(shù)措施
- 小學(xué)一年級數(shù)學(xué)20以內(nèi)的口算題(可直接打印A4)
- 自動化設(shè)備技術(shù)合作協(xié)議書范文
- 作文紙(網(wǎng)格600字A4)
評論
0/150
提交評論