匿名管道
原理
- 內(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 }