資料介紹
Linux 進(jìn)程間通信的幾種主要手段。其中管道和有名管道是最早的進(jìn)程間通信機(jī)制之一,管道可用于具有親緣關(guān)系進(jìn)程間的通信,有名管道克服了管道沒(méi)有名字的限制,因此,除具有管道所具有的功能外,它還允許無(wú)親緣關(guān)系進(jìn)程間的通信。 認(rèn)清管道和有名管道的讀寫(xiě)規(guī)則是在程序中應(yīng)用它們的關(guān)鍵,本文在詳細(xì)討論了管道和有名管道的通信機(jī)制的基礎(chǔ)上,用實(shí)例對(duì)其讀寫(xiě)規(guī)則進(jìn)行了程序驗(yàn)證,這樣做有利于增強(qiáng)讀者對(duì)讀寫(xiě)規(guī)則的感性認(rèn)識(shí),同時(shí)也提供了應(yīng)用范例。
管道概述及相關(guān)API應(yīng)用
管道相關(guān)的關(guān)鍵概念
管道是Linux支持的最初Unix IPC形式之一,具有以下特點(diǎn):
管道是半雙工的,數(shù)據(jù)只能向一個(gè)方向流動(dòng);需要雙方通信時(shí),需要建立起兩個(gè)管道;
只能用于父子進(jìn)程或者兄弟進(jìn)程之間(具有親緣關(guān)系的進(jìn)程);
單獨(dú)構(gòu)成一種獨(dú)立的文件系統(tǒng):管道對(duì)于管道兩端的進(jìn)程而言,就是一個(gè)文件,但它不是普通的文件,它不屬于某種文件系統(tǒng),而是自立門戶,單獨(dú)構(gòu)成一種文件系統(tǒng),并且只存在與內(nèi)存中。
數(shù)據(jù)的讀出和寫(xiě)入:一個(gè)進(jìn)程向管道中寫(xiě)的內(nèi)容被管道另一端的進(jìn)程讀出。寫(xiě)入的內(nèi)容每次都添加在管道緩沖區(qū)的末尾,并且每次都是從緩沖區(qū)的頭部讀出數(shù)據(jù)。
管道的創(chuàng)建:
#include int pipe(int fd[2])
該函數(shù)創(chuàng)建的管道的兩端處于一個(gè)進(jìn)程中間,在實(shí)際應(yīng)用中沒(méi)有太大意義,因此,一個(gè)進(jìn)程在由pipe()創(chuàng)建管道后,一般再fork一個(gè)子進(jìn)程,然后通過(guò)管道實(shí)現(xiàn)父子進(jìn)程間的通信(因此也不難推出,只要兩個(gè)進(jìn)程中存在親緣關(guān)系,這里的親緣關(guān)系指的是具有共同的祖先,都可以采用管道方式來(lái)進(jìn)行通信)。
管道的讀寫(xiě)規(guī)則:
管道兩端可分別用描述字fd[0]以及fd[1]來(lái)描述,需要注意的是,管道的兩端是固定了任務(wù)的。即一端只能用于讀,由描述字fd[0]表示,稱其為管道讀端;另一端則只能用于寫(xiě),由描述字fd[1]來(lái)表示,稱其為管道寫(xiě)端。如果試圖從管道寫(xiě)端讀取數(shù)據(jù),或者向管道讀端寫(xiě)入數(shù)據(jù)都將導(dǎo)致錯(cuò)誤發(fā)生。一般文件的I/O函數(shù)都可以用于管道,如close、read、write等等。
從管道中讀取數(shù)據(jù):如果管道的寫(xiě)端不存在,則認(rèn)為已經(jīng)讀到了數(shù)據(jù)的末尾,讀函數(shù)返回的讀出字節(jié)數(shù)為0;當(dāng)管道的寫(xiě)端存在時(shí),如果請(qǐng)求的字節(jié)數(shù)目大于PIPE_BUF,則返回管道中現(xiàn)有的數(shù)據(jù)字節(jié)數(shù),如果請(qǐng)求的字節(jié)數(shù)目不大于PIPE_BUF,則返回管道中現(xiàn)有數(shù)據(jù)字節(jié)數(shù)(此時(shí),管道中數(shù)據(jù)量小于請(qǐng)求的數(shù)據(jù)量);或者返回請(qǐng)求的字節(jié)數(shù)(此時(shí),管道中數(shù)據(jù)量不小于請(qǐng)求的數(shù)據(jù)量)。注:(PIPE_BUF在include/Linux/limits.h中定義,不同的內(nèi)核版本可能會(huì)有所不同。Posix.1要求PIPE_BUF至少為512字節(jié),red hat 7.2中為4096)。
關(guān)于管道的讀規(guī)則驗(yàn)證:
* readtest.c *
#include
#include
#include
main()
{
int pipe_fd[2];
pid_t pid;
char r_buf[100];
char w_buf[4];
char* p_wbuf;
int r_num;
int cmd;
memset(r_buf,0,sizeof(r_buf));
memset(w_buf,0,sizeof(r_buf));
p_wbuf=w_buf;
if(pipe(pipe_fd)《0)
{
printf(“pipe create errorn”);
return -1;
}
if((pid=fork())==0)
{
printf(“n”);
close(pipe_fd[1]);
sleep(3);//確保父進(jìn)程關(guān)閉寫(xiě)端
r_num=read(pipe_fd[0],r_buf,100);
printf( “read num is %d the data read from the pipe is %dn”,r_num,atoi(r_buf));
close(pipe_fd[0]);
exit();
}
else if(pid》0)
{
close(pipe_fd[0]);//read
strcpy(w_buf,“111”);
if(write(pipe_fd[1],w_buf,4)!=-1)
printf(“parent write overn”);
close(pipe_fd[1]);//write
printf(“parent close fd[1] overn”);
sleep(10);
}
}
程序輸出結(jié)果:
* parent write over
* parent close fd[1] over
* read num is 4 the data read from the pipe is 111
附加結(jié)論:管道寫(xiě)端關(guān)閉后,寫(xiě)入的數(shù)據(jù)將一直存在,直到讀出為止。
?
管道概述及相關(guān)API應(yīng)用
管道相關(guān)的關(guān)鍵概念
管道是Linux支持的最初Unix IPC形式之一,具有以下特點(diǎn):
管道是半雙工的,數(shù)據(jù)只能向一個(gè)方向流動(dòng);需要雙方通信時(shí),需要建立起兩個(gè)管道;
只能用于父子進(jìn)程或者兄弟進(jìn)程之間(具有親緣關(guān)系的進(jìn)程);
單獨(dú)構(gòu)成一種獨(dú)立的文件系統(tǒng):管道對(duì)于管道兩端的進(jìn)程而言,就是一個(gè)文件,但它不是普通的文件,它不屬于某種文件系統(tǒng),而是自立門戶,單獨(dú)構(gòu)成一種文件系統(tǒng),并且只存在與內(nèi)存中。
數(shù)據(jù)的讀出和寫(xiě)入:一個(gè)進(jìn)程向管道中寫(xiě)的內(nèi)容被管道另一端的進(jìn)程讀出。寫(xiě)入的內(nèi)容每次都添加在管道緩沖區(qū)的末尾,并且每次都是從緩沖區(qū)的頭部讀出數(shù)據(jù)。
管道的創(chuàng)建:
#include int pipe(int fd[2])
該函數(shù)創(chuàng)建的管道的兩端處于一個(gè)進(jìn)程中間,在實(shí)際應(yīng)用中沒(méi)有太大意義,因此,一個(gè)進(jìn)程在由pipe()創(chuàng)建管道后,一般再fork一個(gè)子進(jìn)程,然后通過(guò)管道實(shí)現(xiàn)父子進(jìn)程間的通信(因此也不難推出,只要兩個(gè)進(jìn)程中存在親緣關(guān)系,這里的親緣關(guān)系指的是具有共同的祖先,都可以采用管道方式來(lái)進(jìn)行通信)。
管道的讀寫(xiě)規(guī)則:
管道兩端可分別用描述字fd[0]以及fd[1]來(lái)描述,需要注意的是,管道的兩端是固定了任務(wù)的。即一端只能用于讀,由描述字fd[0]表示,稱其為管道讀端;另一端則只能用于寫(xiě),由描述字fd[1]來(lái)表示,稱其為管道寫(xiě)端。如果試圖從管道寫(xiě)端讀取數(shù)據(jù),或者向管道讀端寫(xiě)入數(shù)據(jù)都將導(dǎo)致錯(cuò)誤發(fā)生。一般文件的I/O函數(shù)都可以用于管道,如close、read、write等等。
從管道中讀取數(shù)據(jù):如果管道的寫(xiě)端不存在,則認(rèn)為已經(jīng)讀到了數(shù)據(jù)的末尾,讀函數(shù)返回的讀出字節(jié)數(shù)為0;當(dāng)管道的寫(xiě)端存在時(shí),如果請(qǐng)求的字節(jié)數(shù)目大于PIPE_BUF,則返回管道中現(xiàn)有的數(shù)據(jù)字節(jié)數(shù),如果請(qǐng)求的字節(jié)數(shù)目不大于PIPE_BUF,則返回管道中現(xiàn)有數(shù)據(jù)字節(jié)數(shù)(此時(shí),管道中數(shù)據(jù)量小于請(qǐng)求的數(shù)據(jù)量);或者返回請(qǐng)求的字節(jié)數(shù)(此時(shí),管道中數(shù)據(jù)量不小于請(qǐng)求的數(shù)據(jù)量)。注:(PIPE_BUF在include/Linux/limits.h中定義,不同的內(nèi)核版本可能會(huì)有所不同。Posix.1要求PIPE_BUF至少為512字節(jié),red hat 7.2中為4096)。
關(guān)于管道的讀規(guī)則驗(yàn)證:
* readtest.c *
#include
#include
#include
main()
{
int pipe_fd[2];
pid_t pid;
char r_buf[100];
char w_buf[4];
char* p_wbuf;
int r_num;
int cmd;
memset(r_buf,0,sizeof(r_buf));
memset(w_buf,0,sizeof(r_buf));
p_wbuf=w_buf;
if(pipe(pipe_fd)《0)
{
printf(“pipe create errorn”);
return -1;
}
if((pid=fork())==0)
{
printf(“n”);
close(pipe_fd[1]);
sleep(3);//確保父進(jìn)程關(guān)閉寫(xiě)端
r_num=read(pipe_fd[0],r_buf,100);
printf( “read num is %d the data read from the pipe is %dn”,r_num,atoi(r_buf));
close(pipe_fd[0]);
exit();
}
else if(pid》0)
{
close(pipe_fd[0]);//read
strcpy(w_buf,“111”);
if(write(pipe_fd[1],w_buf,4)!=-1)
printf(“parent write overn”);
close(pipe_fd[1]);//write
printf(“parent close fd[1] overn”);
sleep(10);
}
}
程序輸出結(jié)果:
* parent write over
* parent close fd[1] over
* read num is 4 the data read from the pipe is 111
附加結(jié)論:管道寫(xiě)端關(guān)閉后,寫(xiě)入的數(shù)據(jù)將一直存在,直到讀出為止。
?
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 氫氣管道滲漏問(wèn)題的解決方法 2次下載
- 石油化工行業(yè)管道專業(yè)用什么軟件 13次下載
- 談?wù)勄度胧?b class="flag-6" style="color: red">系統(tǒng)中多進(jìn)程設(shè)計(jì)與進(jìn)程通信
- 在Linux實(shí)現(xiàn)通過(guò)管道進(jìn)行通信的資料合集免費(fèi)下載 0次下載
- Linux應(yīng)用基礎(chǔ)教程之Linux如何進(jìn)行系統(tǒng)管理 2次下載
- 進(jìn)程間通信之管道通信實(shí)驗(yàn)內(nèi)容分析 1次下載
- 進(jìn)程間通信之:管道 0次下載
- 壓力管道文件匯編
- 基于聲發(fā)射技術(shù)的管道泄漏檢測(cè)系統(tǒng)
- 城市蒸汽管道數(shù)字系統(tǒng)設(shè)計(jì)方法
- 通信電纜配線管道圖集 YD5062-98
- 通信管道與通道工程設(shè)計(jì)規(guī)范 YD 5007—2003
- 通信管道與通道工程設(shè)計(jì)規(guī)范
- 甬滬寧進(jìn)口原油管道SCADA系統(tǒng)
- 通信管道設(shè)計(jì)規(guī)范
- 功率放大器在管道定位系統(tǒng)的硬件實(shí)現(xiàn)研究中的應(yīng)用 239次閱讀
- 功率放大器在管道定位系統(tǒng)硬件中的應(yīng)用 701次閱讀
- GIS管道精密對(duì)接設(shè)備機(jī)械系統(tǒng)的設(shè)計(jì)與研究 652次閱讀
- linux中管道符的使用 4292次閱讀
- Linux管道和FIFO應(yīng)用筆記 747次閱讀
- 闡述匿名管道和命名管道 1258次閱讀
- Linux進(jìn)程間通信方法之管道 1997次閱讀
- 淺談進(jìn)程之間的通信方式 2834次閱讀
- 管道數(shù)據(jù)流"實(shí)時(shí)性" 和使用小提示 3127次閱讀
- 管道儀表流程圖中壓力溫度泵及容器的設(shè)計(jì)實(shí)例說(shuō)明 4222次閱讀
- 管道設(shè)計(jì)條件的確定,管道布置應(yīng)考慮的因素 1.1w次閱讀
- 你所不知道的linux匿名管道知識(shí)詳解 3329次閱讀
- Linux中的管道和命名管道介紹 4053次閱讀
- 基于試片斷電法的埋地鋼制天然氣管道防腐檢測(cè)儀測(cè)量 4473次閱讀
- 金屬管道探測(cè)器 4344次閱讀
下載排行
本周
- 1TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 2開(kāi)關(guān)電源基礎(chǔ)知識(shí)
- 5.73 MB | 6次下載 | 免費(fèi)
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設(shè)計(jì)
- 0.60 MB | 3次下載 | 免費(fèi)
- 5基于FPGA的光纖通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 0.61 MB | 2次下載 | 免費(fèi)
- 6基于FPGA的C8051F單片機(jī)開(kāi)發(fā)板設(shè)計(jì)
- 0.70 MB | 2次下載 | 免費(fèi)
- 751單片機(jī)窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費(fèi)
- 8基于51單片機(jī)的RGB調(diào)色燈程序仿真
- 0.86 MB | 2次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33564次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21548次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
- 0.00 MB | 6653次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537796次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191185次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183278次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論