freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

四川大學(xué)linux第4章unix進(jìn)程管理及進(jìn)程通信(參考版)

2025-03-11 20:18本頁面
  

【正文】 /*以只讀方式打開管道 myfifo */ filedes[1]=open(filename, O_WRONLY)。 exit(1)。 char buf[256]。 char *argv []。 char string[]=wele to named pipe。 管道 例 在同一進(jìn)程中首先創(chuàng)建一個有名管道,然后向該管道寫入字符,再將寫入的字符讀出。 關(guān)閉管道的步驟是: ? 內(nèi)核首先處理讀寫進(jìn)程,如果無寫進(jìn)程、有讀進(jìn)程,內(nèi)核會喚醒讀進(jìn)程并讓其讀系統(tǒng)函數(shù)調(diào)用空數(shù)據(jù)返回; ? 如果有寫進(jìn)程、無讀進(jìn)程,內(nèi)核會喚醒寫進(jìn)程并發(fā)送一個發(fā)生錯誤的信號(向某個非讀的進(jìn)程管道中寫入數(shù)據(jù))給寫進(jìn)程。 管道 (3) 管道的關(guān)閉 關(guān)閉有名管道的系統(tǒng)函數(shù)格式如下: close(filedes)。 管道 (2) 有名管道的讀寫 ? 有名管道的讀寫要求進(jìn)程具有對有名管道的存取權(quán)限,讀管道進(jìn)程的數(shù)目不要求與寫管道進(jìn)程的數(shù)目相同。 該調(diào)用返回文件描述符。文件塊的管理形式也是一個循環(huán)隊(duì)列管理,先進(jìn)先出。 ? 與無名管道一樣,對有名管道的打開和訪問必須采用進(jìn)程同步。 管道 (1) 有名管道的打開 ? 與有名管道對應(yīng)的管道文件有自己的文件目錄項(xiàng),可以通過路徑名存取。 其中: pathname是要建立的特殊文件名(有名管道名、目錄名); type and permission給出特殊文件類型和訪問權(quán)限; dev為塊特殊文件和字符特殊文件規(guī)定的主設(shè)備號和次設(shè)備號(此處是有名管道, dev參數(shù)為 0)。 ? 與無名管道不同的是,有名管道在訪問之前必須用系統(tǒng)函數(shù) open()打開。 ? 有名管道利用了文件系統(tǒng)中的可以長期存在的文件實(shí)現(xiàn),適用于所有進(jìn)程之間的通信。 /*讀之后關(guān)閉管道讀端 */ } exit(0)。 printf(%s\n,inbuf)。 /* 在讀管道之前確保父進(jìn)程關(guān)閉寫端 */ read(filedes[0],inbuf,23)。 close(filedes[1])。 /*寫完關(guān)閉管道寫端 */ wait(0)。 printf(the parent process sended\n)。 } 管道 if (pid0) /* 父進(jìn)程 */ { close(filedes[0])。 } if ((pid = fork())0) /* 創(chuàng)建子進(jìn)程 */ { perror(could not create subprocess)。 if (pipe(filedes)0) /* 創(chuàng)建可擦寫的無名管道 */ { perror(could not create unnamed pipe)。 main() { int filedes[2],i,pid。父進(jìn)程將數(shù)據(jù)發(fā)送給子進(jìn)程。 exit(0)。 close(filedes[0])。 /*關(guān)閉管道寫端 */ memset(inbuf, 0, sizeof(inbuf))。 } write(filedes[1],string,23)。 if (pipe(filedes)0) /* 創(chuàng)建無名管道 */ { perror (could not create unnamed pipe)。 int main() { int filedes[2]。首先進(jìn)程創(chuàng)建一個無名管道,然后向該管道寫入字符,再將寫入的字符讀出。 其中: filedes[0]為從管道讀的描述符; 從管道讀出的數(shù)據(jù)放入 buf中; size是讀出的數(shù)據(jù)位組長度。 int filedes[1],size。 管道 (2) 進(jìn)程讀管道 ? 進(jìn)程從管道讀數(shù)據(jù)時如果管道中已經(jīng)有數(shù)據(jù),進(jìn)程則按先進(jìn)先出的原則通過讀指針讀取數(shù)據(jù),讀結(jié)束后,修改索引節(jié)點(diǎn)讀指針并喚醒寫進(jìn)程; ? 如果進(jìn)程要讀的數(shù)據(jù)不在管道中,進(jìn)程則睡眠等待寫進(jìn)程寫入數(shù)據(jù)并將其喚醒。 char buf[]。 管道 寫管道的函數(shù)格式如下: write(filedes[1],buf,size)。 ? 進(jìn)程向管道寫數(shù)據(jù)時須注意管道大小限制,管道中已有的數(shù)據(jù)與要寫入數(shù)據(jù)之和不能大于管道的容量。 管道 (1) 進(jìn)程寫管道 ? 寫進(jìn)程和讀進(jìn)程對管道的訪問需要互斥。 管道 ? 當(dāng)一個進(jìn)程讀管道,核心檢查到管道中有數(shù)據(jù)時,讀進(jìn)程就從索引節(jié)點(diǎn)讀指針標(biāo)記處開始讀,讀完后核心會將當(dāng)前偏移量保存在索引節(jié)點(diǎn)中并喚醒等待寫進(jìn)程。 ? 當(dāng)寫進(jìn)程不止一個時,可能存在一個進(jìn)程寫入管道中的數(shù)據(jù)不連續(xù),其中會插入另一個進(jìn)程寫入的數(shù)據(jù)。 ? 當(dāng)寫進(jìn)程將全部數(shù)據(jù)寫入管道時,內(nèi)核會記下管道的索引節(jié)點(diǎn)寫指針,以使后面的寫進(jìn)程接著寫,同時喚醒所有睡眠等待讀數(shù)據(jù)的進(jìn)程。 管道 ? 管道中的數(shù)據(jù)以緩沖隊(duì)列方式進(jìn)行管理,內(nèi)核在進(jìn)程每次寫之后自動增加管道大小,管道數(shù)據(jù)量隨著逐次寫而逐次增加,內(nèi)核不會讓進(jìn)程寫操作覆蓋管道中的數(shù)據(jù)。 ? 操作系統(tǒng)核心將索引節(jié)點(diǎn)中的直接地址塊作為一個循環(huán)隊(duì)列管理,設(shè)置一個寫指針和一個讀指針。 ? 為了提高進(jìn)程對管道的訪問效率,管道文件只使用文件索引節(jié)點(diǎn)中的直接地址項(xiàng) i_addr(0)~i_addr(9)。 ? filedes[1]是寫入管道的文件描述符, filedes[0]是從管道讀出的文件描述符。 int fileds[2]。如果一個進(jìn)程不使用有名管道時,用系統(tǒng)函數(shù) close()關(guān)閉管道。對有名管道的訪問與對文件的訪問完全相同。 有名管道( Named Pipes) ? 有名管道利用系統(tǒng)函數(shù) mknod()建立,管道文件是可以長期存在的有名文件。 ? 只有調(diào)用 pipe()的進(jìn)程及其子孫進(jìn)程才能識別進(jìn)程創(chuàng)建的無名管道,才能利用該管道讀寫數(shù)據(jù)。 管道 管道有兩種類型:無名管道和有名管道。這樣的文件常被稱為管道( pipe)文件。如果發(fā)送進(jìn)程與接收進(jìn)程之間都需要利用管道傳送數(shù)據(jù),則需要建立兩個管道。管道允許進(jìn)程之間按先進(jìn)先出的方式傳送數(shù)據(jù),數(shù)據(jù)以數(shù)據(jù)流方式在管道中傳送。 } exit(0)。 printf(exiting...\n)。 /*掛起進(jìn)程的系統(tǒng)函數(shù)調(diào)用 */ } } printf(sleeping...\n)。 i++) { if (fork()==0 ) /* 產(chǎn)生子進(jìn)程 */ { printf(i=%d pid=%d\n,i,getpid())。 for (i=1。 /***** This program is signal int, the program39。 ←轉(zhuǎn)作信號處理 i=5 $ 信號 例 下面程序生成 6個子進(jìn)程,子進(jìn)程生成后掛起等待。 } 信號 該程序正常運(yùn)行時: $sigexer1 i=1 i=2 i=3 i=4 i=5 The Program End. 但是如果在程序運(yùn)行到屏幕上打印出 i=4時從鍵盤上送入信號 SIGINT( CtrlC),則程序接收到該信號,作相應(yīng)的信號處理,處理完后返回到原主程序。 } printf(The Program End.\n)。 printf(i=%d\n,i)。 i6。 } main() { int i。 printf(\nhi! The program have received signal and signum=%d。s name is sigexer1 ****/ include include include include void signalint(signum) int signum。 已知在 SIG_DEF為恢復(fù)對接收信號的默認(rèn)處理。 } } 信號 例 下面是接收鍵盤輸入 delete信號而中斷程序執(zhí)行的處理。 /*發(fā)送信號SIGALRM */ printf(pid=%5d\n,getpid())。 setitimer(ITIMER_VIRTUAL,value,NULL)。 = 0。 } void init_time() {struct itimerval value。 sigemptyset()。 =sighandler。 include include includesys/ void sighandler()) { printf(caught signal SIGTERM\n)。 信號被捕捉處理輸出提示信息,并用 kill()發(fā)送一個信號給對方,按下中斷鍵來終止程序。 } void c_catch() { printf(“ child process caught the signal %d\n” ,++ntimes)。 /* 在父進(jìn)程中發(fā)送信號 SIGUSR1給子進(jìn)程 */ kill(pid,SIGUSR1)。) { pause。 default。 pause()。) { sleep(1)。 case 0: /* 設(shè)置子進(jìn)程的信號 SIGUSR1 */ signal(SIGUSR1,c_catch) /* 得到父進(jìn)程標(biāo)示符 */ ppid=getppid()。 /* 系統(tǒng)函數(shù)調(diào)用 fork()生成子進(jìn)程 */ switch (pid=fork()) { case –1: printf(“ fail fork\n” )。 int p_catch( ),c_catch。 include include include include includesys/ int ntimes=0。 例 用 kill()函數(shù)在兩個進(jìn)程之間發(fā)送信號。 信號 4. 信號應(yīng)用舉例 在 linux系統(tǒng)中信號應(yīng)用非常廣泛,如系統(tǒng)對異常事件的處理。 因此,應(yīng)該為 sigaction結(jié)構(gòu)中的 sa_sigaction指定處理函數(shù),而不應(yīng)該為 sa_handler指定信號處理函數(shù),否則,設(shè)置該標(biāo)志變得毫無意義。 sa_flags中包含了許多標(biāo)志位,如 SA_NODEFER、SA_NOMASK和 SA_SIGINFO標(biāo)志位。 /* 對 SIGPOLL信號有意義 */ } 信號 siginfo_t結(jié)構(gòu)中的 si_value可以是一個 4字節(jié)的整數(shù)值,或一個指針。 /* 觸發(fā) fault的內(nèi)存地址 */ int si_band。 /* 內(nèi)核消耗的時間 */ sigval_t si_value。 /* 退出狀態(tài) */ clock_t si_utime。 /* 發(fā)送進(jìn)程 ID */ uid_t si_uid。 /* 錯誤值 */ int si_code。 信號 siginfo_t結(jié)構(gòu)的定義如下: siginfo_t { int si_signo。 _sa_handler指定的處理函數(shù)只有一個參數(shù),即信號值。 sigaction結(jié)構(gòu)定義如下: struct sigaction { union{ __sighandler_t _sa_handler。如果為空,進(jìn)程會以缺省方式對信號處理; 信號 第三個參數(shù) oldact指向的對象用來保存原來對相應(yīng)信號的處理,可指定 oldact為 NULL。 其中: 第一個參數(shù)為信號的值,是除 SIGKILL及 SIGSTOP外的任何一個特定有效的信號。當(dāng)多種類型的信號到達(dá)時,接收進(jìn)程的信號域中有多個域被置位,但對同類信號,接收進(jìn)程只能記住其中一個。 如果函數(shù)調(diào)用 signal失敗,則返回值為 1。其語法格式如下: signal(sig,func); sig是進(jìn)程接收信號的類型。用函數(shù) signal()和 sigaction()安裝信號。 即使 SIGABORT被進(jìn)程設(shè)置為阻塞信號,調(diào)用 abort()后,SIGABORT仍然能被進(jìn)程接收。其語法格式如下: void abort(void)。 第三個參數(shù)可不做處理。 /* seconds */ long tv_usec。 /* current value */ }。其中: 第一個參數(shù)指定定時器類型; 第二個參數(shù)是結(jié)構(gòu) itime
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1