版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
《C語言進(jìn)程設(shè)計(jì)》本課件旨在幫助你了解C語言進(jìn)程設(shè)計(jì)的基本概念、常用系統(tǒng)調(diào)用以及進(jìn)程間通信的方式,并通過實(shí)例演示,幫助你更好地掌握相關(guān)知識(shí)和技能。課程簡介目標(biāo)本課程旨在幫助學(xué)生掌握C語言進(jìn)程設(shè)計(jì)的相關(guān)知識(shí)和技能,并能夠運(yùn)用這些知識(shí)進(jìn)行簡單的程序設(shè)計(jì)。對象本課程適合對C語言編程有一定基礎(chǔ)的同學(xué),想要進(jìn)一步學(xué)習(xí)進(jìn)程設(shè)計(jì)和系統(tǒng)調(diào)用的學(xué)生。內(nèi)容大綱1進(jìn)程概述介紹進(jìn)程的基本概念,包括進(jìn)程的概念、屬性、生命周期、狀態(tài)轉(zhuǎn)換等。2進(jìn)程控制介紹進(jìn)程控制的相關(guān)系統(tǒng)調(diào)用,包括fork()、exec()、wait()、waitpid()等。3進(jìn)程間通信介紹進(jìn)程間通信的常用方式,包括管道、消息隊(duì)列、信號(hào)量、共享內(nèi)存等。4信號(hào)介紹信號(hào)的基本概念,包括信號(hào)的處理方式、信號(hào)的產(chǎn)生和接收等。5守護(hù)進(jìn)程介紹守護(hù)進(jìn)程的概念和設(shè)計(jì)方法,并通過實(shí)例演示守護(hù)進(jìn)程的編寫。6線程介紹線程的基本概念,包括線程的創(chuàng)建、同步機(jī)制、使用場景等。進(jìn)程的概念進(jìn)程是指一個(gè)正在執(zhí)行的程序的實(shí)例。每個(gè)進(jìn)程都有自己的獨(dú)立內(nèi)存空間、資源和執(zhí)行上下文,并能夠獨(dú)立運(yùn)行。進(jìn)程的基本屬性1進(jìn)程ID每個(gè)進(jìn)程都有一個(gè)唯一的進(jìn)程ID,用于標(biāo)識(shí)進(jìn)程。2進(jìn)程名進(jìn)程的名字,通常是程序的執(zhí)行文件名。3狀態(tài)進(jìn)程的狀態(tài),例如運(yùn)行、就緒、阻塞等。4優(yōu)先級進(jìn)程的優(yōu)先級,決定了進(jìn)程的執(zhí)行順序。5內(nèi)存地址空間每個(gè)進(jìn)程都有自己的獨(dú)立的內(nèi)存空間,用于存放程序代碼和數(shù)據(jù)。6資源進(jìn)程所使用的資源,例如文件、網(wǎng)絡(luò)連接等。進(jìn)程的生命周期1創(chuàng)建進(jìn)程被創(chuàng)建,例如通過fork()系統(tǒng)調(diào)用創(chuàng)建子進(jìn)程。2運(yùn)行進(jìn)程正在執(zhí)行,例如在CPU上運(yùn)行代碼。3阻塞進(jìn)程被阻塞,例如等待輸入或資源。4就緒進(jìn)程準(zhǔn)備好運(yùn)行,但沒有得到CPU時(shí)間片。5終止進(jìn)程結(jié)束運(yùn)行,例如執(zhí)行完畢或遇到錯(cuò)誤。進(jìn)程的狀態(tài)轉(zhuǎn)換進(jìn)程的狀態(tài)轉(zhuǎn)換是進(jìn)程生命周期中的重要環(huán)節(jié)。進(jìn)程的狀態(tài)轉(zhuǎn)換通常是由系統(tǒng)調(diào)度器進(jìn)行的,根據(jù)進(jìn)程的狀態(tài)和系統(tǒng)資源的情況,決定哪些進(jìn)程可以運(yùn)行、哪些進(jìn)程需要阻塞或就緒。進(jìn)程控制系統(tǒng)調(diào)用fork()創(chuàng)建子進(jìn)程exec()加載并運(yùn)行新的程序wait()等待子進(jìn)程終止waitpid()等待指定子進(jìn)程終止fork()系統(tǒng)調(diào)用fork()系統(tǒng)調(diào)用用于創(chuàng)建子進(jìn)程。調(diào)用fork()之后,系統(tǒng)會(huì)創(chuàng)建一個(gè)新的進(jìn)程,稱為子進(jìn)程,子進(jìn)程是父進(jìn)程的一個(gè)副本,擁有父進(jìn)程的代碼和數(shù)據(jù),但是擁有自己的內(nèi)存空間和資源。子進(jìn)程會(huì)從fork()調(diào)用后的下一條語句開始執(zhí)行。實(shí)例演示-fork()#include<stdio.h>#include<unistd.h>intmain(){pid_tpid=fork();if(pid==0){//子進(jìn)程printf("子進(jìn)程:pid=%d\n",getpid());}elseif(pid>0){//父進(jìn)程printf("父進(jìn)程:pid=%d,子進(jìn)程pid=%d\n",getpid(),pid);}else{//錯(cuò)誤perror("forkerror");}return0;}該代碼演示了fork()系統(tǒng)調(diào)用的使用方法,創(chuàng)建子進(jìn)程后,父進(jìn)程和子進(jìn)程分別執(zhí)行各自的代碼。exec()系統(tǒng)調(diào)用exec()系統(tǒng)調(diào)用用于加載并運(yùn)行新的程序。調(diào)用exec()之后,當(dāng)前進(jìn)程會(huì)被新的程序所替代,該程序?qū)娜肟邳c(diǎn)開始執(zhí)行。exec()家族包含多個(gè)函數(shù),例如execl()、execlp()、execv()、execvp()等,它們的區(qū)別在于參數(shù)傳遞方式的不同。實(shí)例演示-exec()#include<stdio.h>#include<unistd.h>intmain(){pid_tpid=fork();if(pid==0){//子進(jìn)程execl("/bin/ls","ls","-l",NULL);perror("execlerror");}elseif(pid>0){//父進(jìn)程wait(NULL);printf("父進(jìn)程:pid=%d\n",getpid());}else{//錯(cuò)誤perror("forkerror");}return0;}該代碼演示了execl()系統(tǒng)調(diào)用的使用方法,子進(jìn)程執(zhí)行了/bin/ls命令,輸出當(dāng)前目錄下的文件列表。進(jìn)程的終止進(jìn)程的終止意味著進(jìn)程的結(jié)束,不再執(zhí)行,并釋放其所占用的資源。進(jìn)程終止有幾種方式,例如正常結(jié)束、異常結(jié)束、被信號(hào)終止等。wait()和waitpid()系統(tǒng)調(diào)用wait()和waitpid()系統(tǒng)調(diào)用用于等待子進(jìn)程終止。wait()會(huì)阻塞當(dāng)前進(jìn)程,直到任何子進(jìn)程終止,而waitpid()可以指定等待特定的子進(jìn)程,也可以設(shè)置超時(shí)時(shí)間。它們可以獲取子進(jìn)程的終止?fàn)顟B(tài)和退出碼,以便父進(jìn)程了解子進(jìn)程的運(yùn)行結(jié)果。實(shí)例演示-wait()和waitpid()#include<stdio.h>#include<unistd.h>#include<sys/wait.h>intmain(){pid_tpid=fork();if(pid==0){//子進(jìn)程sleep(5);printf("子進(jìn)程:pid=%d\n",getpid());exit(1);}elseif(pid>0){//父進(jìn)程intstatus;pid_twpid=waitpid(pid,&status,0);if(WIFEXITED(status)){printf("子進(jìn)程正常退出,退出碼:%d\n",WEXITSTATUS(status));}elseif(WIFSIGNALED(status)){printf("子進(jìn)程被信號(hào)終止,信號(hào)編號(hào):%d\n",WTERMSIG(status));}printf("父進(jìn)程:pid=%d\n",getpid());}else{//錯(cuò)誤perror("forkerror");}return0;}該代碼演示了waitpid()系統(tǒng)調(diào)用的使用方法,父進(jìn)程等待子進(jìn)程終止并獲取子進(jìn)程的終止?fàn)顟B(tài)。進(jìn)程間通信概述進(jìn)程間通信(IPC)允許不同進(jìn)程之間共享數(shù)據(jù)和信息,以實(shí)現(xiàn)協(xié)作和同步。進(jìn)程間通信是多任務(wù)操作系統(tǒng)中不可或缺的一部分,它允許不同的進(jìn)程之間進(jìn)行數(shù)據(jù)交換,從而提高系統(tǒng)的效率和性能。管道(pipe)管道是一種半雙工的通信方式,允許一個(gè)進(jìn)程將數(shù)據(jù)寫入管道,另一個(gè)進(jìn)程從管道讀取數(shù)據(jù)。數(shù)據(jù)在管道中以字節(jié)流的形式進(jìn)行傳輸,管道是一段有限的內(nèi)存空間,用來存放進(jìn)程間通信的數(shù)據(jù)。一般情況下,管道只能用于具有親緣關(guān)系的進(jìn)程之間通信,例如父進(jìn)程和子進(jìn)程。實(shí)例演示-管道#include<stdio.h>#include<unistd.h>#include<string.h>intmain(){intpipefd[2];if(pipe(pipefd)<0){perror("pipeerror");return1;}pid_tpid=fork();if(pid==0){//子進(jìn)程close(pipefd[1]);charbuffer[1024];read(pipefd[0],buffer,1024);printf("子進(jìn)程收到消息:%s\n",buffer);close(pipefd[0]);}elseif(pid>0){//父進(jìn)程close(pipefd[0]);charmessage[]="你好,世界!";write(pipefd[1],message,strlen(message));close(pipefd[1]);wait(NULL);}else{//錯(cuò)誤perror("forkerror");}return0;}該代碼演示了管道的使用方法,父進(jìn)程將消息寫入管道,子進(jìn)程從管道讀取消息。消息隊(duì)列消息隊(duì)列是一種異步的通信方式,允許進(jìn)程之間通過消息傳遞進(jìn)行通信。消息隊(duì)列以消息的集合的形式存儲(chǔ)在內(nèi)核中,每個(gè)消息都有一個(gè)類型,消息隊(duì)列可以用于不同進(jìn)程之間進(jìn)行通信,即使它們之間沒有親緣關(guān)系。實(shí)例演示-消息隊(duì)列#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#defineKEY12345structmessage{longmtype;charmtext[1024];};intmain(){//創(chuàng)建消息隊(duì)列intmsqid=msgget(KEY,IPC_CREAT|0666);if(msqid<0){perror("msggeterror");exit(1);}//發(fā)送消息structmessagesend_msg;send_msg.mtype=1;strcpy(send_msg.mtext,"你好,世界!");if(msgsnd(msqid,&send_msg,sizeof(send_msg.mtext),0)<0){perror("msgsnderror");exit(1);}//接收消息structmessagerecv_msg;if(msgrcv(msqid,&recv_msg,sizeof(recv_msg.mtext),1,0)<0){perror("msgrcverror");exit(1);}printf("收到消息:%s\n",recv_msg.mtext);//刪除消息隊(duì)列if(msgctl(msqid,IPC_RMID,NULL)<0){perror("msgctlerror");exit(1);}return0;}該代碼演示了消息隊(duì)列的使用方法,包括創(chuàng)建消息隊(duì)列、發(fā)送消息和接收消息。信號(hào)量信號(hào)量是一種用于進(jìn)程間同步的機(jī)制,它本質(zhì)上是一個(gè)計(jì)數(shù)器,用于控制對共享資源的訪問。信號(hào)量用于控制對資源的訪問,例如當(dāng)多個(gè)進(jìn)程需要訪問同一個(gè)資源時(shí),可以利用信號(hào)量來確保一次只有一個(gè)進(jìn)程可以訪問該資源。實(shí)例演示-信號(hào)量#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>#defineKEY12345intmain(){//創(chuàng)建信號(hào)量集intsemid=semget(KEY,1,IPC_CREAT|0666);if(semid<0){perror("semgeterror");exit(1);}//初始化信號(hào)量unionsemun{intval;structsemid_ds*buf;unsignedshortint*array;}arg;arg.val=1;if(semctl(semid,0,SETVAL,arg)<0){perror("semctlerror");exit(1);}//使用信號(hào)量structsembufsop;sop.sem_num=0;sop.sem_op=-1;//P操作,減1sop.sem_flg=SEM_UNDO;//進(jìn)入臨界區(qū)if(semop(semid,&sop,1)<0){perror("semoperror");exit(1);}//臨界區(qū)代碼printf("進(jìn)入臨界區(qū)...\n");sleep(1);//離開臨界區(qū)sop.sem_op=1;//V操作,加1if(semop(semid,&sop,1)<0){perror("semoperror");exit(1);}//刪除信號(hào)量集if(semctl(semid,0,IPC_RMID,arg)<0){perror("semctlerror");exit(1);}return0;}該代碼演示了信號(hào)量的使用方式,包括創(chuàng)建信號(hào)量集、初始化信號(hào)量、進(jìn)入臨界區(qū)、離開臨界區(qū)以及刪除信號(hào)量集。共享內(nèi)存共享內(nèi)存是進(jìn)程之間共享數(shù)據(jù)的一種最快的通信方式。進(jìn)程可以將一塊內(nèi)存空間映射到自己的地址空間,并通過這塊內(nèi)存空間進(jìn)行數(shù)據(jù)交換,從而實(shí)現(xiàn)數(shù)據(jù)共享。共享內(nèi)存可以用于不同進(jìn)程之間的通信,即使它們之間沒有親緣關(guān)系。實(shí)例演示-共享內(nèi)存#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>#defineKEY12345intmain(){//創(chuàng)建共享內(nèi)存intshmid=shmget(KEY,1024,IPC_CREAT|0666);if(shmid<0){perror("shmgeterror");exit(1);}//獲取共享內(nèi)存地址char*shm_addr=(char*)shmat(shmid,NULL,0);if(shm_addr==(char*)-1){perror("shmaterror");exit(1);}//訪問共享內(nèi)存strcpy(shm_addr,"你好,世界!");//等待其他進(jìn)程訪問共享內(nèi)存sleep(5);//分離共享內(nèi)存if(shmdt(shm_addr)<0){perror("shmdterror");exit(1);}//刪除共享內(nèi)存if(shmctl(shmid,IPC_RMID,NULL)<0){perror("shmctlerror");exit(1);}return0;}該代碼演示了共享內(nèi)存的使用方法,包括創(chuàng)建共享內(nèi)存、獲取共享內(nèi)存地址、訪問共享內(nèi)存、分離共享內(nèi)存和刪除共享內(nèi)存。信號(hào)(signal)信號(hào)是一種用于進(jìn)程間異步通信的機(jī)制。當(dāng)某個(gè)事件發(fā)生時(shí),例如程序異?;蛴脩糨斎?,操作系統(tǒng)會(huì)向進(jìn)程發(fā)送一個(gè)信號(hào),進(jìn)程可以捕獲并處理信號(hào),從而改變自己的行為。信號(hào)的基本概念1信號(hào)類型信號(hào)類型是指不同的信號(hào),例如SIGKILL、SIGINT、SIGTERM等。2信號(hào)產(chǎn)生信號(hào)的產(chǎn)生是指信號(hào)是如何被發(fā)送的,例如系統(tǒng)事件、用戶輸入、程序調(diào)用等。3信號(hào)接收信號(hào)的接收是指進(jìn)程如何接收信號(hào),例如通過信號(hào)處理函數(shù)或默認(rèn)處理方式。4信號(hào)處理信號(hào)的處理是指進(jìn)程如何對信號(hào)進(jìn)行處理,例如忽略信號(hào)、執(zhí)行默認(rèn)操作、調(diào)用信號(hào)處理函數(shù)等。信號(hào)的處理方式忽略信號(hào)進(jìn)程忽略信號(hào),不對信號(hào)進(jìn)行任何處理。默認(rèn)處理進(jìn)程執(zhí)行操作系統(tǒng)的默認(rèn)信號(hào)處理方式,例如終止進(jìn)程。信號(hào)處理函數(shù)進(jìn)程定義一個(gè)信號(hào)處理函數(shù),用來處理特定的信號(hào)。實(shí)例演示-信號(hào)#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<signal.h>voidsigint_handler(intsigno){printf("收到SIGINT信號(hào),正在退出...\n");exit(1);}intmain(){//設(shè)置SIGINT信號(hào)的處理函數(shù)if(signal(SIGINT,sigint_handler)==SIG_ERR){perror("signalerror");exit(1);}printf("正在運(yùn)行...\n");while(1){sleep(1);}return0;}該代碼演示了信號(hào)處理函數(shù)的使用方法,當(dāng)進(jìn)程收到SIGINT信號(hào)時(shí),會(huì)執(zhí)行sigint_handler()函數(shù),并打印消息并退出程序。守護(hù)進(jìn)程守護(hù)進(jìn)程是一種在后臺(tái)運(yùn)行的進(jìn)程,它通常不與終端交互,并且在系統(tǒng)啟動(dòng)時(shí)自動(dòng)運(yùn)行,它負(fù)責(zé)執(zhí)行一些重要的系統(tǒng)任務(wù),例如管理系統(tǒng)資源、監(jiān)控系統(tǒng)狀態(tài)等。守護(hù)進(jìn)程通常用來執(zhí)行一些需要長時(shí)間運(yùn)行的任務(wù),例如網(wǎng)絡(luò)服務(wù)、日志記錄等。實(shí)例演示-守護(hù)進(jìn)程#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>intmain(){//創(chuàng)建子進(jìn)程pid_tpid=fork();if(pid<0){perror("forkerror");exit(1);}elseif(pid>0){//父進(jìn)程退出exit(0);}//設(shè)置進(jìn)程組if(setsid()<0){perror("setsiderror");exit(1);}//更改工作目錄if(chdir("/")<0){perror("chdirerror");exit(1);}//關(guān)閉文件描述符close(STDIN_FILENO);close(STDOUT_FILENO);close(STDERR_FILENO);//重定向標(biāo)準(zhǔn)輸入、輸出和錯(cuò)誤流open("/dev/null",O_RDWR);dup2(0,STDIN_FILENO);dup2(0,STDOUT_FILENO);dup2(0,STDERR_FILENO);//循環(huán)運(yùn)行守護(hù)進(jìn)程代碼while(1){printf("守護(hù)進(jìn)程正在運(yùn)行...\n");sleep(5);}return0;}該代碼演示了守護(hù)進(jìn)程的編寫方法,包括創(chuàng)建子進(jìn)程、設(shè)置進(jìn)程組、更改工作目錄、關(guān)閉文件描述符、重定向標(biāo)準(zhǔn)流以及循環(huán)運(yùn)行守護(hù)進(jìn)程代碼。線程概述線程是輕量級的進(jìn)程,它可以共享進(jìn)程的資源,例如內(nèi)存空間、文件描述符等,線程可以獨(dú)立運(yùn)行,并具有自己的執(zhí)行上下文。線程的出現(xiàn)使程序可以更加高效地利用系統(tǒng)資源,并提高程序的并發(fā)性。線程的基本屬性1線程ID每個(gè)線程都有一個(gè)唯一的線程I
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年農(nóng)業(yè)全產(chǎn)業(yè)鏈融合發(fā)展路徑
- 2026年無人駕駛車輛測試技術(shù)培訓(xùn)
- 存儲(chǔ)系統(tǒng)容災(zāi)備份建設(shè)手冊
- 2026科技部監(jiān)管中心招聘派遣制職工2人備考題庫及一套完整答案詳解
- 2026年RPA機(jī)器人流程自動(dòng)化應(yīng)用
- 財(cái)務(wù)資金安全培訓(xùn)課件
- 職業(yè)壓力與職業(yè)病的醫(yī)療化防治
- 職業(yè)健康監(jiān)護(hù)中認(rèn)知功能的重要性
- 陽江2025年廣東陽江市陽西縣溪頭鎮(zhèn)人民政府招聘合同制禁毒工作人員筆試歷年參考題庫附帶答案詳解
- 邢臺(tái)2025年河北邢臺(tái)沙河市招聘中小學(xué)教師100人筆試歷年參考題庫附帶答案詳解
- 開工第一課安全生產(chǎn)培訓(xùn)內(nèi)容
- 2025年研究生招生學(xué)科專業(yè)代碼冊
- 男生陰莖延長術(shù)課件
- 企業(yè)文化與員工滿意度關(guān)系研究
- 中國重癥超聲臨床應(yīng)用專家共識(shí)
- 潔凈區(qū)環(huán)境監(jiān)測培訓(xùn)課件
- 鋁材銷售技巧培訓(xùn)
- 2024-2025學(xué)年上學(xué)期深圳高一物理期末模擬卷1
- 胸痛中心聯(lián)合例會(huì)培訓(xùn)
- 天然氣長輸管道工程培訓(xùn)課件
- 江門市2025屆普通高中高三10月調(diào)研測試 英語試卷(含答案)
評論
0/150
提交評論