管道通信
一、進(jìn)程通信的目的:?
1.數(shù)據(jù)傳輸:一個(gè)進(jìn)程需要將它的數(shù)據(jù)發(fā)送給另一個(gè)進(jìn)程?
2.資源共享:多個(gè)進(jìn)程之間共享同樣的資源?
3.通知事件:一個(gè)進(jìn)程需要向另一個(gè)或一組進(jìn)程發(fā)送消息,通知它們發(fā)生了某種事件?
4.進(jìn)程控制:有些進(jìn)程希望完全控制另一個(gè)進(jìn)程的執(zhí)行(如Debug進(jìn)程),此時(shí)控制進(jìn)程希望能夠攔截另一個(gè)進(jìn)程的所有操作,并能夠及時(shí)知道它的狀態(tài)改變
二、管道通信?
? 管道是單向的、先進(jìn)先出的,它把一個(gè)進(jìn)程的輸出和另一個(gè)進(jìn)程的輸入連接在一起。
? 一個(gè)進(jìn)程(寫進(jìn)程)在管道的尾部寫入數(shù)據(jù),另一個(gè)進(jìn)程(讀進(jìn)程)從管道的頭部讀出數(shù)據(jù)
? 數(shù)據(jù)被一個(gè)進(jìn)程讀出后,將被從管道中刪除,其它讀進(jìn)程將不能再讀到這些數(shù)據(jù)。
? 管道提供了簡(jiǎn)單的流控制機(jī)制,進(jìn)程試圖讀空管道時(shí),進(jìn)程將阻塞。同樣,管道已經(jīng)滿時(shí),進(jìn)程再試圖向管道寫入數(shù)據(jù),進(jìn)程將阻塞
? 管道包括無(wú)名管道和有名管道兩種,前者用于父進(jìn)程和子進(jìn)程間的通信,后者可用于運(yùn)行于同一系統(tǒng)中的任意兩個(gè)進(jìn)程間的通信。?
無(wú)名管道創(chuàng)建:?
int pipe(int filedis[2]);?
當(dāng)一個(gè)管道建立時(shí),它會(huì)創(chuàng)建兩個(gè)文件描述符:?
filedis[0] 用于讀管道,?
filedis[1] 用于寫管道
? 創(chuàng)建管道pipe?
讀管道read?
寫管道write?
關(guān)閉管道close
? 管道用于不同進(jìn)程間通信。通常先創(chuàng)建一個(gè)管道,再通過(guò)fork函數(shù)創(chuàng)建一個(gè)子進(jìn)程,該子進(jìn)程會(huì)繼承父進(jìn)程所創(chuàng)建的管道
? 1.管道通訊是單向的,有固定的讀端和寫端。2. 數(shù)據(jù)被進(jìn)程從管道讀出后,在管道中該數(shù)據(jù)就不存在了。3. 當(dāng)進(jìn)程去讀取空管道的時(shí)候,進(jìn)程會(huì)阻塞。4. 當(dāng)進(jìn)程往滿管道寫入數(shù)據(jù)時(shí),進(jìn)程會(huì)阻塞。5. 管道容量為64KB
? 必須在系統(tǒng)調(diào)用fork( )前調(diào)用pipe( ),否則子進(jìn)程將不會(huì)繼承文件描述符
函數(shù)整理:?
①pipe?
函數(shù)的作用:建立無(wú)名管道?
函數(shù)的原型:int pipe(int filedes[2]);?
頭文件:#include < unistd.h >?
返回值:成功0,出錯(cuò)-1
②mkfifo?
函數(shù)的作用:創(chuàng)建有名管道?
函數(shù)的原型:int mkfifo(const char *filename,mode_t mode);?
參數(shù)的作用:filename:有名管道的路徑、名稱?
mode:管道的方式?
返回值:成功0,出錯(cuò)-1
③kill?
函數(shù)的作用:傳送信號(hào)給指定的進(jìn)程?
函數(shù)的原型:int kill(pid_t pid,int sig);?
函數(shù)的參數(shù):pid > 0:將信號(hào)傳給進(jìn)程識(shí)別碼為pid的進(jìn)程?
pid = 0:將信號(hào)傳給和目前進(jìn)程相同進(jìn)程組的所有進(jìn)程?
pid = -1:將信號(hào)廣播傳送給系統(tǒng)內(nèi)所有的進(jìn)程?
pid < 0:將信號(hào)傳給進(jìn)程組識(shí)別碼為pid絕對(duì)值的所有進(jìn)程?
sig:信號(hào)?
返回值:成功0,出錯(cuò)-1?
頭文件:#include < sys/types.h >?
#include < signal.h >
④raise?
函數(shù)的作用:發(fā)送信號(hào)給自身?
函數(shù)的原型:int raise(int sig);?
頭文件:#include < signal.h >
⑤alarm?
函數(shù)的作用:設(shè)置信號(hào)傳送鬧鐘?
函數(shù)的原型:unsigned int alarm(unsigned int second);?
返回值:返回之前鬧鐘的剩余秒數(shù),如果之前未設(shè)鬧鐘則返回0
⑥pause?
函數(shù)的作用:讓進(jìn)程暫停直到信號(hào)出現(xiàn)?
函數(shù)的原型:int pause(void);?
返回值:-1
總結(jié)
- 上一篇: system函数 与 exec函数的区别
- 下一篇: 信号通信