linux 匿名管道實例詳解
linux中進(jìn)程的一種通信方式——匿名管道
pipe函數(shù)建立管道
調(diào)用pipe函數(shù)時在內(nèi)核中開辟一塊緩沖區(qū)(稱為管道)用于通信,它有一個讀端一個寫端,然后通過_pipe參數(shù)傳出給用戶程序兩個文件描述符,_pipe[0]指向管道的讀端,_pipe[1]指向管道的寫端。所以管道在用戶程序看起來就像一個打開的文件,通過read(_pipe[0]);或者write(_pipe[1]);向這個文件讀寫數(shù)據(jù)其實是在讀寫內(nèi)核緩沖區(qū)。pipe函數(shù)調(diào)用成功返回0,調(diào)用失敗返回-1。
1父進(jìn)程調(diào)用pipe開辟管道,得到兩個文件描述符指向管道的兩端。
2. 父進(jìn)程調(diào)用fork創(chuàng)建⼦進(jìn)程,那么子進(jìn)程也有兩個文件描述符指向同一管道。
3. 父進(jìn)程關(guān)閉管道讀端,子進(jìn)程關(guān)閉管道寫端。父進(jìn)程可以往管道里寫,子進(jìn)程可以從管道⾥讀,管道是用環(huán)形隊列實現(xiàn)的,數(shù)據(jù)從寫端流入從讀端流出,這樣就實現(xiàn)了進(jìn)程間通信
匿名管道間的通信是單向的,并且是、只能是具有血緣關(guān)系的進(jìn)程間通信
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int _pipe[2];
int ret = pipe(_pipe);
if (ret < 0)
{
perror("pipe");
return 1;
}
pid_t id = fork ();
if (id<0)
{
perror("fork");
return 2;
}
else if (id == 0)
{
// child
int count =5;
close (_pipe[0]);
char* msg = "hello bit";
while (count --)
{
write(_pipe[1],msg,strlen(msg));
sleep(1);
}
close (_pipe[1]);
exit(123);
}
else
{
// Father
close(_pipe[1]);
char buf[128];
while(1)
{
int count =5;
ssize_t s = read ( _pipe[0],buf,sizeof(buf)-1);
if (s<0)
{
perror("read");
}
else if(s==0)
{
printf("write is close\n");
return 2;
}
else
{
buf[s] ='\0';
printf ("child >> father: %s\n",buf);
}
count --;
if (count == 0)
{
close (_pipe[0]);
break;
}
}
int status = 0;
pid_t _wait = waitpid (id, &status,0);
if (_wait > 0)
{
printf("exit code is %d, signal is %d\n",
WIFEXITED(status), status & 0xff);
}
}
return 0;
}

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
關(guān)于C++中構(gòu)造函數(shù)初始化成員列表的總結(jié)
下面小編就為大家?guī)硪黄P(guān)于C++中構(gòu)造函數(shù)初始化成員列表的總結(jié)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
Matlab實現(xiàn)繪制有氣泡感的網(wǎng)絡(luò)圖
這篇文章主要介紹了如何利用Matlab實現(xiàn)繪制有氣泡感的網(wǎng)絡(luò)圖,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下2023-02-02
Qt采用線程以隊列方式實現(xiàn)下發(fā)數(shù)據(jù)
在C++中隊列是一種常用的數(shù)據(jù)結(jié)構(gòu)之一,一種特殊的線性表,一般采用先進(jìn)先出的方式。本文主要為大家介紹了Qt如何以隊列方式實現(xiàn)下發(fā)數(shù)據(jù),感興趣的可以了解一下2022-10-10
關(guān)于C/C++中的side effect(負(fù)效應(yīng))和sequence point(序列點)
不知你在寫code時是否遇到這樣的問題?int i = 3; int x = (++i) + (++i) + (++i); 問x值為多少?進(jìn)行各種理論分析,并在編譯器上實踐,然而可能發(fā)現(xiàn)最終的結(jié)果是不正確的,也是不穩(wěn)定的,不同的編譯器可能會產(chǎn)生不同的結(jié)果。這讓人很頭疼2013-10-10

