管道特点:
只能用于具有共同祖先的进程之间进行通信
管道提供流式服务
一般而言进程退出,管道释放
一般而言内核会对管道操作进行同步与互斥
管道是半双工,数据只能向一个方向流动,双方通信需建立两个管道
服务端serverpipe.c
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
umask(0); //允许进程创建文件时有最大权限
if(mkfifo("mypipe",0644)<0) //创建命名管道
{
perror("mkfifo"); //创建失败
exit(1);
}
int rfd=open("mypipe",O_RDONLY); //只读方式打开管道
if(rfd<0)
{
perror("open"); //打开失败
exit(1);
}
char buf[1024]; //缓冲区
while(1)
{
buf[0]=0;
printf("please wait....\n");
ssize_t s=read(rfd,buf,sizeof(buf)-1); //读取rfd内容到buf
if(s>0)
{
buf[s-1]=0; //读取成功
printf("client say # %s\n",buf);
}
else if(s==0) //读到文件结尾,或无可读数据
{
printf("server quit");
exit(0);
}
else //读取失败
{
perror("read");
exit(1);
}
}
close(rfd); //关闭读取
return 0 ;
}
客户端client
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/types.h>
int main()
{
int wfd=open("mypipe",O_WRONLY); //只写方式打开管道
if(wfd<0)
{
perror("open"); //打开失败
exit(1);
}
char buf[1024]; //缓冲区
while(1)
{
buf[0]=0;
printf("please enter#");
fflush(stdout); //刷新
ssize_t s=read(0,buf,sizeof(buf)-1); //从当前读入buf中
if(s>0)
{ //读取成功
buf[s]=0;
write(wfd,buf,sizeof(buf)-1); //从buf中往wfd所在文件中写
}
else if(s<=0)
{
perror("read"); //读取失败
exit(1);
}
}
close(wfd); //关闭写入
return 0 ;
}
makefile
.PHONY :all
all:clientpipe serverpipe
clientpipe: clientpipe.c
gcc -o $@ $^
serverpipe: serverpipe.c
gcc -o $@ $^
.PHONE :clean
clean :
rm -f clientpipe serverpipe
1、write()
函数定义:ssize_t write (int fd, const void * buf, size_t count);
函数说明:write()会把参数buf所指的内存写入count个字节到参数放到所指的文件内。
返回值:如果顺利write()会返回实际写入的字节数。当有错误发生时则返回-1,错误代码存入errno中。
2、read()
函数定义:ssize_t read(int fd, void * buf, size_t count);
函数说明:read()会把参数fd所指的文件传送count 个字节到buf 指针所指的内存中。
返回值:返回值为实际读取到的字节数, 如果返回0, 表示已到达文件尾或是无可读取的数据。若参数count 为0, 则read()不会有作用并返回0。