Unix進(jìn)程通信:管道

匿名管道

原理
  • 內(nèi)核空間的隊(duì)列式內(nèi)存(緩沖區(qū))
  • 隊(duì)列式內(nèi)存京革,內(nèi)核管理同步和互斥婶溯,而共享內(nèi)存和文件通信需要信號(hào)量或者鎖機(jī)制來(lái)保證同步互斥
特點(diǎn)
  • 半雙工
  • 進(jìn)程全部退出后淀歇,匿名管道自動(dòng)釋放困鸥,所以數(shù)據(jù)無(wú)法保存
  • 可以使用read write close,不能用lseek(隊(duì)列讀寫)
  • 常用與父子進(jìn)程間通信(匿名管道來(lái)進(jìn)行非親緣進(jìn)程間通信需要輔助以文件描述符借帘?)
  • 由內(nèi)核管理的隊(duì)列讀寫方式洋措,自帶同步互斥功能

API

#include <unistd.h>
int pipe(int pipefd[2]);

參數(shù)表:
pipefd[2]:讀端和寫端的文件描述符
返回值:
0:成功
-1:出錯(cuò)

示例

/*
匿名管道用于fork的父子進(jìn)程之間
整形數(shù)組兩個(gè)成員分別是讀端和寫端济蝉,對(duì)應(yīng)兩個(gè)文件描述符
雖然進(jìn)程可以同時(shí)獲得讀端和寫端兩個(gè)文件描述符,但是菠发,
由于匿名管道應(yīng)該是半雙工的王滤,所以真正使用的時(shí)候,
發(fā)送方應(yīng)該先關(guān)閉讀端描述符滓鸠,接收方應(yīng)該關(guān)閉寫端描述符
如果想全雙工通信雁乡,應(yīng)該建立兩個(gè)匿名管道,如果用一個(gè)會(huì)發(fā)生錯(cuò)亂

pfd[0]對(duì)應(yīng)讀哥力,pfd[1]對(duì)應(yīng)寫
1. int pfd[2]
2. pipe(pfd)
3. 父write(pfd[1],"123456",7)
   子read(pdf[0],buf,7)  
*/

//匿名管道用于父子進(jìn)程間的通信蔗怠。
//父寫子讀
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
using namespace std;

int main()
{

    char buf[100];
    
    int pfd[2];
    
    if( ( pipe(pfd) ) == -1)
    {
        perror("pipe");
        exit(1);
    }
    
    
    int pid;
    if( ( pid=fork() ) == -1)
    {
        perror("fork");
        exit(1);    
    }
    else if(pid == 0)//子進(jìn)程,讀
    {
        close(pfd[1]);
        sleep(1);
        read(pfd[0],buf,7);
        cout << buf << endl;
        close(pfd[0]);
    }
    else
    {
        close(pfd[0]);
        write(pfd[1],"123456",7);//父進(jìn)程,寫
        close(pfd[1]);
        wait(NULL);
        
    }

    return 0;
}

命名管道

原理
  • 內(nèi)核空間的隊(duì)列式內(nèi)存
  • 又名(FIFO文件)
特點(diǎn)
  • 文件系統(tǒng)可見(jiàn)吩跋,有對(duì)應(yīng)的文件節(jié)點(diǎn)信息
  • 雖然文件系統(tǒng)里有寞射,但是硬盤中沒(méi)有
  • 因?yàn)橛忻Q,非親緣進(jìn)程可以依靠他通信
  • 按照文件操作進(jìn)行操作(lseek除外)
API
#include <sys/stat.h>
int mkfifo(char *filename,mode_t mode);

參數(shù)表:
filename:命名管道名稱
mode:使用方式(如0644)
返回值:
0:成功
-1:失敗

示例代碼

寫端

  1 #include <sys/stat.h>//mkfifo() 
  2 #include <sys/types.h>
  3 #include <fcntl.h>
  4 #include <unistd.h>//sleep(),write(),close()
  5 
  6 int main()
  7 {
  8         char buf[100];
  9         int fd;
 10 
 11 
 12 
 13         mkfifo("testpipe",0644);
 14         fd = open("testpipe",O_WRONLY);
 15         write(fd,"123456",7);
 16         close(fd);
 17 
 18         sleep(10);
 19         return 0;
 20 }    

讀端

  1 #include <sys/stat.h>
  2 #include <sys/types.h>
  3 #include <fcntl.h>
  4 #include <unistd.h>
  5 
  6 #include <iostream>
  7 using namespace std;
  8 
  9 int main()
 10 {
 11         char buf[100];
 12         int fd;
 13         sleep(1);
 14         fd = open("testpipe",O_RDONLY);
 15         read(fd,buf,7);
 16         cout << buf <<endl;
 17         
 18         close(fd);
 19         return 0;
 20 }                                                                                           
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锌钮,一起剝皮案震驚了整個(gè)濱河市桥温,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌梁丘,老刑警劉巖侵浸,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異氛谜,居然都是意外死亡掏觉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門值漫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)澳腹,“玉大人,你說(shuō)我怎么就攤上這事〗此” “怎么了沥邻?”我有些...
    開(kāi)封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)羊娃。 經(jīng)常有香客問(wèn)我唐全,道長(zhǎng),這世上最難降的妖魔是什么蕊玷? 我笑而不...
    開(kāi)封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任邮利,我火速辦了婚禮,結(jié)果婚禮上集畅,老公的妹妹穿的比我還像新娘近弟。我一直安慰自己,他們只是感情好挺智,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布祷愉。 她就那樣靜靜地躺著,像睡著了一般赦颇。 火紅的嫁衣襯著肌膚如雪二鳄。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天媒怯,我揣著相機(jī)與錄音订讼,去河邊找鬼。 笑死扇苞,一個(gè)胖子當(dāng)著我的面吹牛欺殿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鳖敷,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼脖苏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了定踱?” 一聲冷哼從身側(cè)響起棍潘,我...
    開(kāi)封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎崖媚,沒(méi)想到半個(gè)月后亦歉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡畅哑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年肴楷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荠呐。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡阶祭,死狀恐怖绷杜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情濒募,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布圾结,位于F島的核電站,受9級(jí)特大地震影響筝野,放射性物質(zhì)發(fā)生泄漏晌姚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一歇竟、第九天 我趴在偏房一處隱蔽的房頂上張望挥唠。 院中可真熱鬧,春花似錦焕议、人聲如沸宝磨。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)唤锉。三九已至,卻和暖如春别瞭,著一層夾襖步出監(jiān)牢的瞬間窿祥,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蝙寨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晒衩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓墙歪,卻偏偏與公主長(zhǎng)得像听系,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子箱亿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一跛锌、進(jìn)程間通信的概念 每個(gè)進(jìn)程各自有不同的用戶地址空間,任何一個(gè)進(jìn)程的全局變量在另一個(gè)進(jìn)程中都看不到届惋,所以進(jìn)程之間...
    TyiMan閱讀 166,272評(píng)論 16 318
  • 一.管道機(jī)制(pipe) 1.Linux的fork操作 在計(jì)算機(jī)領(lǐng)域中髓帽,尤其是Unix及類Unix系統(tǒng)操作系統(tǒng)中,...
    Geeks_Liu閱讀 3,690評(píng)論 1 9
  • 前言 管道是UNIX環(huán)境中歷史最悠久的進(jìn)程間通信方式脑豹,也是最簡(jiǎn)單的進(jìn)程間通信方式郑藏,一般用來(lái)作為IPC的入門,最合適...
    GeekerLou閱讀 1,149評(píng)論 0 6
  • 移步系列Android跨進(jìn)程通信IPC系列[http://www.reibang.com/p/6e346c824...
    凱玲之戀閱讀 2,298評(píng)論 0 6
  • 操作系統(tǒng)的主要任務(wù)是管理計(jì)算機(jī)的軟件瘩欺、硬件資源”馗牵現(xiàn)代操作系統(tǒng)的主要特點(diǎn)是多用戶和多任務(wù)拌牲,也就是程序的并行執(zhí)行,wi...
    杰倫哎呦哎呦閱讀 2,518評(píng)論 0 14