客户端与服务端通信(client&server)的管道实现

管道特点

    只能用于具有共同祖先的进程之间进行通信
    管道提供流式服务
    一般而言进程退出,管道释放
    一般而言内核会对管道操作进行同步与互斥
    管道是半双工,数据只能向一个方向流动,双方通信需建立两个管道

服务端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。

猜你喜欢

转载自blog.csdn.net/yu876876/article/details/80325424