gogo专业大尺度亚洲高清人体,美女张开双腿让男生桶,亚洲av无码一区二区三区鸳鸯影院,久久久久国产精品人妻

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > IPC機制之管道

IPC機制之管道 時間:2018-12-17      來源:華清遠見

每個進程各自有不同的用戶地址空間,任何一個進程的全局變量在另一個進程中都看不到,所以進程之間要交換數(shù)據(jù)必須通過內(nèi)核,在內(nèi)核中開辟一塊緩沖區(qū),進程1把數(shù)據(jù)從用戶空間拷到內(nèi)核緩沖區(qū),進程2再從內(nèi)核緩沖區(qū)把數(shù)據(jù)讀走,內(nèi)核提供的這種機制稱為進程間通信(IPC,InterProcess Communication)。

管道是一種最基本的IPC機制,由pipe函數(shù)創(chuàng)建:

int pipe(int filedes[2]);

調(diào)用pipe函數(shù)時在內(nèi)核中開辟一塊緩沖區(qū)(稱為管道)用于通信,它有一個讀端一個寫端,然后通過filedes參數(shù)傳出給用戶程序兩個文件描述符,filedes[0]指向管道的讀端,filedes[1]指向管道的寫端(很好記,就像0是標準輸入1是標準輸出一樣)。所以管道在用戶程序看起來就像一個打開的文件,通過read(filedes[0]);或者write(filedes[1]);向這個文件讀寫數(shù)據(jù)其實是在讀寫內(nèi)核緩沖區(qū)。pipe函數(shù)調(diào)用成功返回0,調(diào)用失敗返回-1。

管道具體的劃分為兩種:命令管道與匿名管道

1.命名管道(FIFO)

匿名管道應用的一個限制就是只能在具有共同祖先(具有親緣關系)的進程間通信。

如果我們想在不相關的進程之間交換數(shù)據(jù),可以使用FIFO文件來做這項工作,它經(jīng)常被稱為命名管道。

命名管道可以從命令行上創(chuàng)建,命令行方法是使用下面這個命令:

$ mkfifo filename

命名管道也可以從程序里創(chuàng)建,相關函數(shù)有:

int mkfifo(const char *filename,mode_t mode);

2.匿名管道

匿名管道由pipe函數(shù)創(chuàng)建并打開。

命名管道由mkfifo函數(shù)創(chuàng)建,打開用open。

FIFO(命名管道)與pipe(匿名管道)之間唯一的區(qū)別在它們創(chuàng)建與打開的方式不同,這些工作完成之后,它們具有相同的語義。

3.命名管道的打開規(guī)則

如果當前打開操作是為讀而打開FIFO時

O_NONBLOCK disable:阻塞直到有相應進程為寫而打開該FIFO

O_NONBLOCK enable:立刻返回成功

如果當前打開操作是為寫而打開FIFO時

O_NONBLOCK disable:阻塞直到有相應進程為讀而打開該FIFO

O_NONBLOCK enable:立刻返回失敗,錯誤碼為ENXIO

需要注意的是打開的文件描述符默認是阻塞的,大家可以寫兩個很簡單的小程序測試一下,主要也就一條語句

int fd = open("p2", O_WRONLY); 假設p2是命名管道文件,把打開標志換成 O_RDONLY 就是另一個程序了,可以先運行RD程序,此時會阻塞,再在另一個窗口運行WR程序,此時兩個程序都會從open返回成功。非阻塞時也不難測試,open時增加標志位就可以了。

 

上一篇:什么是Bootloader

下一篇:哈夫曼算法原理

熱點文章推薦
華清學員就業(yè)榜單
高薪學員經(jīng)驗分享
熱點新聞推薦
前臺專線:010-82525158 企業(yè)培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權(quán)所有 ,京ICP備16055225號-5,京公海網(wǎng)安備11010802025203號

回到頂部