試驗(yàn)四進(jìn)程通信_第1頁
試驗(yàn)四進(jìn)程通信_第2頁
試驗(yàn)四進(jìn)程通信_第3頁
試驗(yàn)四進(jìn)程通信_第4頁
試驗(yàn)四進(jìn)程通信_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、實(shí)驗(yàn)四 進(jìn)程間通信一、實(shí)驗(yàn)?zāi)康?掌握利用管道機(jī)制實(shí)現(xiàn)進(jìn)程間的通信的方法.掌握利用消息緩沖隊(duì)列機(jī)制實(shí)現(xiàn)進(jìn)程間的通信的方法.掌握利用共享存儲區(qū)機(jī)制實(shí)現(xiàn)進(jìn)程間的通信的方法. 了解Linux系統(tǒng)中進(jìn)程軟中斷通信的基本原理二、實(shí)驗(yàn)學(xué)時2學(xué)時三、實(shí)驗(yàn)內(nèi)容1.掌握實(shí)現(xiàn)進(jìn)程間通信的系統(tǒng)調(diào)用的功能和方法進(jìn)程通信,是指進(jìn)程之間交換信息。 從這個意義上講,進(jìn)程之間的同步、互斥也是一種 信息交換,也是一種通信。但是,這里所說的 通信”是指進(jìn)程之間交換較多的信息這樣一種 情況,特別是在由數(shù)據(jù)相關(guān)和有合作關(guān)系的進(jìn)程之間,這種信息交換是十分必要和數(shù)量較大的。進(jìn)程間通信是協(xié)調(diào)解決多個進(jìn)程之間的約束關(guān)系,實(shí)現(xiàn)進(jìn)程共同進(jìn)展的關(guān)鍵

2、技術(shù),是多道系統(tǒng)中控制進(jìn)程并發(fā)執(zhí)行必不可少的機(jī)制。(1)進(jìn)程的通信方式:a.直接通信是指信息直接傳遞給接收方,如管道。在發(fā)送時,指定接收方的地址或標(biāo)識,也可以指定多個接收方或廣播式地址,send(Receiver, message%在接收時,允許接收來自任意發(fā)送方的消息,并在讀出消息的同時獲取發(fā)送方的地址,receive(Sender,message)ob.間接通信:借助于收發(fā)雙方進(jìn)程之外的共享數(shù)據(jù)結(jié)構(gòu)作為通信中轉(zhuǎn),如消息隊(duì)列。這種 數(shù)據(jù)結(jié)構(gòu)稱為緩沖區(qū)或信箱。通常收方和發(fā)方的數(shù)目可以是任意的。(2)進(jìn)程間通信的類型:a.共享存儲器系統(tǒng): 基于共享數(shù)據(jù)結(jié)構(gòu)的通信方式 :只能傳遞狀態(tài)和整數(shù)值(控制

3、信息),包括進(jìn)程互斥和同步所采用的信號量機(jī)制。速度快,但傳送信息量小,編程復(fù)雜,屬于低級通信;基于共享存儲區(qū)的通信方式 :能夠傳送任意數(shù)量的數(shù)據(jù),屬于高級通信。b.消息傳遞系統(tǒng):在消息傳遞系統(tǒng)中,進(jìn)程間的數(shù)據(jù)交換以消息為單位,用戶直接利用系 統(tǒng)提供的一組通信命令(原語)來實(shí)現(xiàn)通信。c.管道通信:管道是一條在進(jìn)程間以字節(jié)流方式傳送的通信通道。它由OS核心的緩沖區(qū)(通常幾十KB)來實(shí)現(xiàn),是單向的;在實(shí)質(zhì)上,是一個有 OS維護(hù)的特殊共享文件,常用于命 令行所指定的輸入輸出重定向和管道命令。在使用管道前要建立相應(yīng)的管道,然后才可使用。Linux 管道a.無名管道:一個可以在文件系統(tǒng)中長期存在的、具有路

4、徑名的文件。 用系統(tǒng)調(diào)用mknod()建立。它克服無名管道使用上的局限性,可讓更多的進(jìn)程也能利用管道進(jìn)行通信。因而其它進(jìn)程可以知道它的存在,并能利用路徑名來訪問該文件。對有名管道的訪問方式與訪問其他 文件一樣,需先用open()打開。通過pipe系統(tǒng)調(diào)用可以創(chuàng)建無名管道,得到兩個文件描述 符,分別用于寫和讀。int pipe(int fd2); /頭文件 unistd.h,返回值:0 (成功),-1 (發(fā)生錯誤)文件描述符fd0為讀端,fd1為寫端通過系統(tǒng)調(diào)用write和read進(jìn)行管道的寫和讀read(fd,buf,nbyte)從fd所指示的文件中讀出 nbyte個字節(jié)的數(shù)據(jù),并將它們送至由

5、指針 buf所指 示的緩沖區(qū)中。如該文件被加鎖,等待,直到鎖打開為止。write(fd,buf,nbyte)把nbyte個字節(jié)的數(shù)據(jù),從buf所指向的緩沖區(qū)寫到由fd所指向的文件中。如文件加鎖,暫停寫入,直至開鎖。參數(shù)定義:int read(fd,buf,nbyte); /* write(fd,buf,nbyte)參數(shù)定義同 read*/int fd;char *buf;unsigned nbyte;進(jìn)程間雙向通信,通常需要兩個管道只適用于父子進(jìn)程之間或父進(jìn)程安排的各個子進(jìn)程之間b. Linux中的有名管道,可通過 mknod系統(tǒng)調(diào)用建立:指定 mode為S_IFIFO,或調(diào)用C庫 函數(shù)mkf

6、ifo產(chǎn)生-int mknod(const char *path, mode_t mode, dev_t dev)-int mkfifo(const chat *path, mode_t mode)(4)消息緩沖機(jī)制消息(message)與窗口系統(tǒng)中的消息”不同。通常是不定長數(shù)據(jù)塊。消息的發(fā)送不需要接收方準(zhǔn)備好,隨時可發(fā)送。相應(yīng)的數(shù)據(jù)結(jié)構(gòu):type message buffer = recordsendersizetextnextendLinux消息:消息隊(duì)列(message queue):每個message不定長,由類型(type)和正文(text)組成Linux 消息隊(duì)列 API:頭文件

7、sys/types.h, sys/ipc.h, sys/msg.hmsgget依據(jù)用戶給出的整數(shù)值 key,創(chuàng)建新消息隊(duì)列或打開現(xiàn)有消息隊(duì)列,返回一個 消息隊(duì)列ID;msgsnd發(fā)送消息;msgrcv接收消息,可以指定消息類型;沒有消息時,返回 -1;msgctl對消息隊(duì)列進(jìn)行控制,如刪除消息隊(duì)列;通過指定多種消息類型,可以在一個消息隊(duì)列中建立多個虛擬信道注意:消息隊(duì)列不隨創(chuàng)建它的進(jìn)程的終止而自動撤銷,必須用msgctl(msgqid, IPC_RMID,0)。另外,msgget獲得消息隊(duì)列ID之后,fork創(chuàng)建子進(jìn)程,在子進(jìn)程中能繼承該消息隊(duì)列 ID而不必再一次msggetint msgge

8、t(key_t key, int flag1語法格式:msgqid=msgget(key, flag)功能:獲得一個消息的描述符,該描述符指定一個消息對流以便于其他系統(tǒng)調(diào)用。其中,key由系統(tǒng)規(guī)定類型,sys/type.ho flag本身由操作允許權(quán)和控制命令值相或“得到,如:IPC_CREAT|0400表示是否該隊(duì)列應(yīng)被創(chuàng)建,IPC_EXCL|0400表示該隊(duì)列的創(chuàng)建應(yīng)是互斥的。msgqid是該系統(tǒng)調(diào)用返回的描述符,失敗則返回一1。int msgsnd(int id, struct msgbuf *msgp, int size, int flag);功能:發(fā)送一消息。其中,id為返回消息隊(duì)列

9、的描述符。msgp指向用戶存儲區(qū)的一個構(gòu)造體指針。size指示由msgp指向的數(shù)據(jù)結(jié)構(gòu)中字符數(shù)組的長度,即消息長度,該數(shù)組的 最大值由MSGMAX 字體可調(diào)用參數(shù)來確定。flag規(guī)定當(dāng)核心用盡內(nèi)部緩沖空間時應(yīng)執(zhí)行 的動作:若在flag中未設(shè)置IPC_NOWAIT ,則當(dāng)該消息隊(duì)列中的字節(jié)數(shù)超過一最大值時,或 系統(tǒng)范圍的消息數(shù)超過某一最大值時,調(diào)用msgsnd進(jìn)程阻塞;若設(shè)置IPC_NOWAIT ,則在此情況下,msgsnd直接返回。int msgrcv(int id, struct msgbuf *msgp, int size, int type, int flag);語法格式: count=

10、msgrcv(id, msgp, size, type, flag)功能:接收一消息,count返回消息正文的字節(jié)數(shù)。 其中,struct msgbuflong mtyoe; char mtext ;id 消息隊(duì)列的描述符。msgp用來存放欲接收消息的用戶數(shù)據(jù)結(jié)構(gòu)的地址。size指示msgp中數(shù)據(jù)數(shù)組的大小。type的第一個消息;為負(fù),接IPC_NOWAIT ,則立即返回;size,核心截斷所接收的消息。type為0接收該隊(duì)列的第一個消息;為正,接收類型為 收小于或等于type絕對值的最低類型的第一個消息。flag規(guī)定倘若該隊(duì)列無消息,核心應(yīng)當(dāng)做什么事。若設(shè)置 若在flag中設(shè)置MSG_NOE

11、RROR ,且所接收的消息大學(xué)大于int msgctl(int id, int cmd, struct msgid_ds *buf);功能:查詢一個消息描述符的狀態(tài),設(shè)置它的狀態(tài)及刪除一個消息描述符。其中,id用來識別該消息的描述符。cmd規(guī)定命令的類型:IPC_STAT將與id相關(guān)聯(lián)的消息隊(duì)列首標(biāo)讀入 buf; IPC_SET為IPC RMID 刪除 id這個消息隊(duì)列設(shè)置有效的用戶和小組表示及操作允許權(quán)和字節(jié)的數(shù)量; 的消息隊(duì)列。buf是含有控制參數(shù)或查詢結(jié)果的用戶數(shù)據(jù)結(jié)構(gòu)的地址。struct ipc_permushort uid;/當(dāng)前用戶 id ushort uid;/當(dāng)前進(jìn)程組id u

12、short cuid; 創(chuàng)建用戶 id ushort cgid; 創(chuàng)建進(jìn)程組id ushort mode; /存取許可權(quán) short pad1; long pad2; 由系統(tǒng)使用 struct msgid_dsstruct ipc_perm msgperm; /許可權(quán)結(jié)構(gòu) short pad17; /由系統(tǒng)使用ushort onsg_qnum; 隊(duì)歹 U 上 7 肖息ushort msg_qbytes; /隊(duì)列上最大字節(jié)數(shù) ushort msg_lspid;/最后發(fā)送消息的PID ushort msg_lrpid; /最后接收消息的 PID time_t msg_stime; /最后發(fā)送消息的

13、時間 time_t msg_rtime; /最后接收消息的時間 time_t msg_ctime; 最后更改消息的時間(5)共享存儲區(qū)(shared memory)相當(dāng)于內(nèi)存,可以任意讀寫和使用任意數(shù)據(jù)結(jié)構(gòu)(當(dāng)然,對指針要注意),需要進(jìn)程互 斥和同步的輔助來確保數(shù)據(jù)一致性。Linux的共享存儲區(qū):-創(chuàng)建或打開共享存儲區(qū)(shmget):依據(jù)用戶給出的整數(shù)值 key,創(chuàng)建新區(qū)或打開現(xiàn)有區(qū), 返回一個共享存儲區(qū)ID。-連接共享存儲區(qū)(shmat):連接共享存儲區(qū)到本進(jìn)程的地址空間,可以指定虛擬地址fork創(chuàng)建的子進(jìn)或由系統(tǒng)分配,返回共享存儲區(qū)首地址。父進(jìn)程已連接的共享存儲區(qū)可被 程繼承。-拆除共享

14、存儲區(qū)連接(shmdt):拆除共享存儲區(qū)與本進(jìn)程地址空間的連接。-共享存儲區(qū)控制(shmctl):對共享存儲區(qū)進(jìn)行控制。如:共享存儲區(qū)的刪除需要顯式調(diào)用 shmctl(shmid, IPC_RMID, 0);一頭文件: sys/types.h, /sys/ipc.h, sys/shm.h int shmget(key_t key, int size, int flag);語法格式: shmid=shmget(key, size, flag)功能:創(chuàng)建一個關(guān)鍵字為 key,長度為size的共享存儲區(qū)。其中,size為存儲區(qū)的字節(jié) 數(shù)。key、flag與系統(tǒng)調(diào)用msgget相同。int shmat

15、(int id, char *addr, int flag);語法格式: virtaddr=shmat(id, addr, flag)功能:從邏輯上將一個共享存儲區(qū)附接到進(jìn)程的虛擬地址空間上。id為共享存儲區(qū)的標(biāo)識符。addr用戶要使用共享存儲區(qū)附接的虛地址,若為 0,系統(tǒng)選擇一個適當(dāng)?shù)牡刂穪砀浇釉摴蚕韰^(qū)。flag規(guī)定對此區(qū)的讀寫權(quán)限,以及系統(tǒng)是否應(yīng)對用戶規(guī)定的地址做舍入操作:如果 flag 中設(shè)置了 shm_rnd即表示操作系統(tǒng)在必要時舍去這個地址;如果設(shè)置了shm_rdonly,表示只允許讀操作。viraddr是附接的虛地址。int shmdt(char *addr);功能:把一個共享存儲

16、區(qū)從指定進(jìn)程的虛地址空間斷開,當(dāng)調(diào)用成功,返回0值;不成功,返回-1。addr為系統(tǒng)調(diào)用shmat所返回的地址。int shmctl(int id, int cmd, struct shmid_ds *buf);功能:對與共享存儲區(qū)關(guān)聯(lián)的各種參數(shù)進(jìn)行操作,從而對共享存儲區(qū)進(jìn)行控制。調(diào)用成功返回0,否則-1。其中,id為被共享存儲區(qū)的描述符。cmd規(guī)定命令的類型:IPC_STAT返回包含在指定的shmid相關(guān)數(shù)據(jù)結(jié)構(gòu)中的狀態(tài)信 息,并且把它放置在用戶存儲區(qū)中的*buf指針?biāo)傅臄?shù)據(jù)結(jié)構(gòu)中。執(zhí)行此命令的進(jìn)程必須有讀取允許權(quán);IPC_SET對于指定的shmid,為它設(shè)置有效用戶和小組標(biāo)識和操作存取權(quán)

17、; IPC_RMID刪除指定的shmid以及與它相關(guān)的共享存儲區(qū)的數(shù)據(jù)結(jié)構(gòu);SHM_LOCK 在內(nèi)存中鎖定指定的共享存儲區(qū),必須是超級用戶才可以進(jìn)行此項(xiàng)操作。buf是一個用戶級數(shù)據(jù)結(jié)構(gòu)地址。2.編寫程序?qū)崿F(xiàn)進(jìn)程的管道通信。參考程序4.1#include #include #include #includeint pid1,pid2;main() int fd2;char outpipe100,inpipe100;pipe(fd); /*創(chuàng)建一個管道*/while (pid1=fork( )=-1);if(pid1=0)lockf(fd1,1,0);sprintf(outpipe,child 1

18、 process issending message!);/* 把串放入數(shù)組 outpipe 中*/write(fd1,outpipe,50);sleep(5);lockf(fd1,0,0);exit(0);elsewhile(pid2=fork( )=-1);if(pid2=0) lockf(fd1,1,0);sprintf(outpipe,child 2 process is sending message!);write(fd1,outpipe,50);sleep(5);lockf(fd1,0,0);exit(0);)elsewait(0);read(fd0,inpipe,50); /*

19、 從管道中讀長為50字節(jié)白串*/閱讀并運(yùn)行程序并回答以下問題:printf(%sn,inpipe);wait(0);read(fd0,inpipe,50); printf(%sn,inpipe);exit(0);)問題1:該程序中使用的管道是有名管道還是無名管道?程序中紅色部分的含義是什么?問題2:程序的含義是什么?運(yùn)行結(jié)果是什么?為什么?.編寫兩個程序client.c 和server.c ,分別用于消息的發(fā)送和接收參考程序4.2server.c參考程序如下:#include #include #include #include #include #define MSGKEY 75 struc

20、t msgform long mtype;char mtext1000;msg;int msgqid; void server() msgqid=msgget(MSGKEY,0777|IPC_CREAT);/*創(chuàng)建75#消息隊(duì)列*/ do msgrcv(msgqid,&msg,1030,0,0);/*接收消息*/printf(server)receivedn);while(msg.mtype!=1);msgctl(msgqid,IPC_RMID,0);/*刪除消息隊(duì)列,歸還資源 */exit(0); main() server();client.c參考程序如下:#include #includ

21、e #include #include #include #define MSGKEY 75 struct msgform long mtype;char mtext1000;msg;int msgqid; void client() int i;msgqid=msgget(MSGKEY,0777);/*打開75#W息隊(duì)列*/ for(i=10;i=1;i-) msg.mtype=i;printf(client)sentn);msgsnd(msgqid,&msg,1024,0);/*發(fā)送消息*/ exit(0);main()client();()建議該題目的運(yùn)行方法為:將上述兩個程序分別編譯為

22、server和client,并按以下方式執(zhí)行:./server & /*當(dāng)在前臺運(yùn)行某個作業(yè)時,終端被該作業(yè)占據(jù);而在后臺運(yùn)行作業(yè)時,它不會占據(jù)終端??梢允褂?&命令把作業(yè)放到后臺執(zhí)行。該命令的一般形式為:命令 &*/ipcs -q/*輸出有關(guān)信息隊(duì)列(message queue)勺信息*/./client閱讀并運(yùn)行程序并回答以下問題:問題1:運(yùn)行結(jié)果是什么?該程序?yàn)槭裁葱枰诤笈_運(yùn)行server.c?若不如此會出現(xiàn)什么現(xiàn)象?為什么?問題2:兩個程序的含義是什么?請解釋其運(yùn)行結(jié)果的含義?.使用共享存儲區(qū)來實(shí)現(xiàn)兩個進(jìn)程之間的通信。參考程序4.3#include #include#include

23、#include #include #define SHMKEY 75 int shmid,i,p1,p2;int *addr;void CLIENT()/* 發(fā)送過程 */ (int i;shmid=shmget(SHMKEY,1024,0777);/* 打 開共享存儲區(qū)*/addr= (int *)shmat(shmid,0,0); /*獲取共享 存儲區(qū)的首地址*/for (i=29;i=0;i-)( while (*addr!=-1);/* 判斷是否可寫 */ *addr=i;/* 寫數(shù)據(jù) */ printf(%d,*addr);printf(client)sentn);) exit(0

24、);)void SERVER()/* 接收進(jìn)程 */閱讀并運(yùn)行程序并回答以下問題:問題1:運(yùn)行結(jié)果是什么? 問題2:(int i;shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); /*創(chuàng)建共享存儲區(qū)*/addr= (int *)shmat(shmid,0,0);do(*addr=-1;while (*addr=-1);/*判斷信息是否傳來 */ printf(%d,*addr+30); /* 讀,并加工數(shù)據(jù)*/printf(server)receivedn);while(*addr);shmctl(shmid,IPC_RMID,0); /* 撤消共享存儲區(qū),歸

25、還資源*/exit(0);main()(while (p1=fork()=-1);/* 父進(jìn)程*/if (p1=0) SERVER();/* 子進(jìn)程 p1*/while (p2=fork()=-1); /* 父進(jìn)程 */if (p2=0) CLIENT。;/* 子進(jìn)程 p2*/wait(0); /* 父進(jìn)程 */wait(0); /* 父進(jìn)程 */兩個程序的含義是什么?請解釋其運(yùn)行結(jié)果的含義?5*,編制一段程序,使其實(shí)現(xiàn)進(jìn)程的軟中斷通信。要求:使用系統(tǒng)調(diào)用fork ()創(chuàng)建兩個子進(jìn)程,再用系統(tǒng)調(diào)用signal ()讓父進(jìn)程捕捉鍵盤上來的中斷信號(即按Del鍵);當(dāng)捕捉到中斷信號后,父進(jìn)程用系統(tǒng)

26、調(diào)用kill ()向兩個子進(jìn)程發(fā)出信號,子進(jìn)程捕捉到信號后分別輸出 下列信息后終止:Child process 1 is killed by parent!Child process 2 is killed by parent!父進(jìn)程等待兩個子進(jìn)程終止后,輸出如下的信息后終止: Parent process is killed! 參考資料 1 .信號的基本概念每個信號都對應(yīng)一個正整數(shù)常量(稱為signal number,即信號編號。定義在系統(tǒng)頭文件signal.h中),代表同一用戶的諸進(jìn)程之間傳送事先約定的信息的類型,用于通知某 進(jìn)程發(fā)生了某異常事件。每個進(jìn)程在運(yùn)行時,都要通過信號機(jī)制來檢查是

27、否有信號到達(dá)。若有,便中斷正在執(zhí)行的程序,轉(zhuǎn)向與該信號相對應(yīng)的處理程序,以完成對該事件的處理; 處理結(jié)束后再返回到原來的斷點(diǎn)繼續(xù)執(zhí)行。實(shí)質(zhì)上,信號機(jī)制是對中斷機(jī)制的一種模擬,故在早期的UNIX版本中又把它稱為軟中斷。信號與中斷的相似點(diǎn):(1)采用了相同的異步通信方式;(2 )當(dāng)檢測出有信號或中斷請求時,都暫停正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行相應(yīng)的處理程序;(3)都在處理完畢后返回到原來的斷點(diǎn);(4)對信號或中斷都可進(jìn)行屏蔽。信號與中斷的區(qū)別:(1 )中斷有優(yōu)先級,而信號沒有優(yōu)先級,所有的信號都是平等的;(2 )信號處理程序是在用戶態(tài)下運(yùn)行的,而中斷處理程序是在核心態(tài)下運(yùn)行;(3)中斷響應(yīng)是及時的,而信

28、號響應(yīng)通常都有較大的時間延遲。信號機(jī)制具有以下三方面的功能:(1 )發(fā)送信號。發(fā)送信號的程序用系統(tǒng)調(diào)用kill()實(shí)現(xiàn);(2 )預(yù)置對信號的處理方式。接收信號的程序用signal()來實(shí)現(xiàn)對處理方式的預(yù)置;(3 )收受信號的進(jìn)程按事先的規(guī)定完成對相應(yīng)事件的處理。.信號的發(fā)送信號的發(fā)送,是指由發(fā)送進(jìn)程把信號送到指定進(jìn)程的信號域的某一位上。如果目標(biāo)進(jìn)程正在一個可被中斷的優(yōu)先級上睡眠, 核心便將它喚醒, 發(fā)送進(jìn)程就此結(jié)束。 一個進(jìn)程可能在 其信號域中有多個位被置位,代表有多種類型的信號到達(dá),但對于一類信號,進(jìn)程卻只能記 住其中的某一個。進(jìn)程用kill()向一個進(jìn)程或一組進(jìn)程發(fā)送一個信號。.對信號的處

29、理當(dāng)一個進(jìn)程要進(jìn)入或退出一個低優(yōu)先級睡眠狀態(tài)時,或一個進(jìn)程即將從核心態(tài)返回用戶態(tài)時,核心都要檢查該進(jìn)程是否已收到軟中斷。當(dāng)進(jìn)程處于核心態(tài)時,即使收到軟中斷也不予理睬;只有當(dāng)它返回到用戶態(tài)后,才處理軟中斷信號。 對軟中斷信號的處理分三種情況進(jìn)行:(1 )如果進(jìn)程收到的軟中斷是一個已決定要忽略的信號( function=1 ),進(jìn)程不做任何處 理便立即返回;(2 )進(jìn)程收到軟中斷后便退出( function=0 );(3 )執(zhí)行用戶設(shè)置的軟中斷處理程序。.所涉及的中斷調(diào)用1) kill()系統(tǒng)調(diào)用格式int kill(pid,sig)參數(shù)定義int pid,sig;其中,pid是一個或一組進(jìn)程的標(biāo)

30、識符,參數(shù) sig是要發(fā)送的軟中斷信號。(1 ) pid0時,核心將信號發(fā)送給進(jìn)程pid。(2 ) pid=0時,核心將信號發(fā)送給與發(fā)送進(jìn)程同組的所有進(jìn)程。(3 ) pid=-1時,核心將信號發(fā)送給所有用戶標(biāo)識符真正等于發(fā)送進(jìn)程的有效用戶標(biāo)識號 的進(jìn)程。2 ) signal()預(yù)置對信號的處理方式,允許調(diào)用進(jìn)程控制軟中斷信號。系統(tǒng)調(diào)用格式signal(sig,function)頭文件為#include 參數(shù)定義signal(sig,function)int sig;void (*func)()其中sig用于指定信號的類型,sig為0則表示沒有收到任何信號,余者如下表:值名字說明01SIGHUP

31、掛起(hangup )02SIGINT中斷,當(dāng)用戶從鍵盤按 Ac鍵或Abreak鍵時03SIGQUIT退出,當(dāng)用戶從鍵盤按quit鍵時041SIGILL法指令_05SIGTRAP跟蹤陷阱(trace trap),啟動進(jìn)程,跟蹤代碼的執(zhí)行06SIGIOTOT指令07SIGEMTEMT指令08SIGFPE浮點(diǎn)運(yùn)算溢出09SIGKILL殺死、終止進(jìn)程10SIGBUS總線錯誤11SIGSEGV段違例(segmentation violation ),進(jìn)程試圖去訪問其虛地址空間以外的位置12SIGSYS系統(tǒng)調(diào)用中參數(shù)錯,如系統(tǒng)調(diào)用號非法13SIGPIPE句某個非讀管道中寫入數(shù)據(jù)14SIGALRM鬧鐘。當(dāng)

32、某進(jìn)程希望在某時間后接收信號時發(fā)此信號15SIGTERM軟件終止(software termination )16SIGUSR1用戶自定義信號117SIGUSR2用戶自定義信號218 SIGCLD某個子進(jìn)程死19 SIGPWR電源故障function :在該進(jìn)程中的一個函數(shù)地址,在核心返回用戶態(tài)時,它以軟中斷信號的序號作為 參數(shù)調(diào)用該函數(shù),對除了信號SIGKILL , SIGTRAP和SIGPWR以外的信號,核心自動地重新設(shè)置軟中斷信號處理程序的值為SIG_DFL , 一個進(jìn)程不能捕獲 SIGKILL信號。function的解釋如下:(1 ) function=1時,進(jìn)程對sig類信號不予理睬,亦即屏蔽了該類信號;(2 ) function=0時,缺省值,進(jìn)程在收到sig信號后應(yīng)終止自己;(3 ) function為非0 ,非1類整數(shù)時,function的值即作為信號處理程序的指針。參考程序4.4#include #include#include #include void waiting( ),stop(); int wait_mark;main()int p1,p2,stdout;

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論