无名管道双向通讯linux
基础知识
1.Linux中一种简单且使用频繁的进程间通信方式
2.一种特殊的管道文件,只存在于内存中,不使用外存
3.管道是单向的、先进先出的、无结构的、固定大小的字节流
4.写进程在管道的尾端写入数据,读进程在管道的首端读出数据
数据读出后将从管道中移走
5.管道的流控制机制:
进程试图读空管道时,在有数据写入管道前,进程将一直阻塞
管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞
6.限制管道的大小
管道是一个固定大小的缓冲区
Linux中,该缓冲区的大小为1页,即4K字节,因此不像文件那样不加检验地增长
写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写
7.读取进程可能工作得比写进程快
当所有当前进程数据已被读取时,管道变空
随后的read()调用将默认地被阻塞,等待某些数据被写入
利用无名管道实现父子进程的双向通讯
message.c
#include<stdio.h>
#include<sys/types.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
int main()
{
int fd1[2];
int fd2[2];
int res=pipe(fd1);
if(res==-1)
{
perror("pipe"); exit(EXIT_FAILURE);
}
res=pipe(fd2);
if(res==-1)
{
perror("pipe");
exit(EXIT_FAILURE);
}
pid_t pid;
pid=fork();
if(pid==0)//childchar
{
sendc[SIZE];
char sendp[SIZE];
close(fd1[1]);
close(fd2[0j);
while(1)
{
read(fd1[0],sendp,SIZE);
printf("parent:%s\n",sendp);
printf("write some words by child:>");
scanf("%s",&sendc);
if(strcmp(sendc,"over")==0)
break;
write(fd2[1],sendc,strlen(sendc)+1);
}
close(fd1[0]);
close(fdz[1j);
}
else if(pid >0)//parent
{
char sendc[SIZE];
char sendp[SIZE];
close(fd1[0]);
close(fd2[1]);
while(1)
{
printf("write some words by parents:>");
scanf("%s",&sendp);
if(strcmp(sendp,"over")==0)
break;
write(fd1[1],sendp,strlen(sendp)+1);
read(fd2[0],sendc,SIZE);
printf("child:%s\n",sendc);
}
close(fd1[1]);
close(fd2[0]);
}
运行结果: