zoukankan      html  css  js  c++  java
  • 有名管道的应用实例,创建两个有名管道实现全双工通信,两个进程间的聊天

    创建两个有名管道来实现不同进程间的全双工通信。

    两个进程聊天程序:一个server端,一个client端。

    例子用到了read函数:

    read函数只是一个通用的读文件设备的接口。是否阻塞需要由设备的属性和设定所决定。一般来说,读字符终端、网络的socket描述字,管道文件等,这些文件的缺省read都是阻塞的方式。

    如果是读磁盘上的文件,一般不会是阻塞方式的。但使用锁和fcntl设置取消文件O_NOBLOCK状态,也会产生阻塞的read效果。

    server端:

     

    #include <stdio.h>
    #include <unistd.h>
    #include <strings.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    
    
    #define FIFO_WRITE "readfifo"
    #define FIFO_READ "writefifo"
    #define LEN       300
    
    int main(int argc, char* argv[])
    {
        char buf[LEN];
        char readbuf[LEN];
        int wfd;
        int rfd;
        int len;
    
        mkfifo(FIFO_WRITE, S_IFIFO|0666);
    
        rfd = open(FIFO_READ, O_RDONLY);
        wfd = open(FIFO_WRITE, O_WRONLY);
    
        
        
        while(1)
        {
            bzero(readbuf, LEN);
            len = read(rfd, readbuf, LEN);
            printf("len=%d
    ", len);
            if (len > 0)
            {
                
                readbuf[len] = '';
                printf("client: %s
    ", readbuf);
    
                if (strncmp("quit", readbuf, strlen(readbuf)) == 0)
                {
                    break;
                }
    
                
            }
    
            bzero(buf, LEN);
            printf("server: ");
            fgets(buf, LEN, stdin);
            buf[strlen(buf)-1] = '';
    
            write(wfd, buf, strlen(buf));
            
        
    
    
            
            
        }
        
        
    
        close(wfd);
        
    
        unlink(FIFO_WRITE);
    
        close(rfd);
    
    
    
        return 0;    
    }

     

     

    client端:

    #include <stdio.h>
    #include <unistd.h>
    #include <strings.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    
    
    #define FIFO_READ "readfifo"
    #define FIFO_WRITE "writefifo"
    #define LEN       300
    
    int main(int argc, char* argv[])
    {
        char buf[LEN];
        char readbuf[LEN];
        int wfd;
        int rfd;
        int len;
    
        mkfifo(FIFO_WRITE, S_IFIFO|0666);
    
        wfd = open(FIFO_WRITE, O_WRONLY);
    
        rfd = open(FIFO_READ, O_RDONLY);
        
        while(1)
        {
            bzero(buf, LEN);
            printf("client: ");
            fgets(buf, LEN, stdin);
            buf[strlen(buf)-1] = '';
    
            write(wfd, buf, strlen(buf));
    
            printf("buf:%s
    ", buf);
            
            if (strncmp("quit", buf, strlen(buf)) == 0)
            {
                break;
            }
    
            bzero(readbuf, LEN);
            len = read(rfd, readbuf, LEN);
            if (len > 0)
            {
                
                readbuf[len] = '';
                printf("server: %s
    ", readbuf);
            }
            
            
        }
        
    
        close(wfd);
        
    
        unlink(FIFO_WRITE);
    
        close(rfd);
    
    
    
        return 0;    
    }

     

  • 相关阅读:
    祈澈菇凉的高端知识资源分享星球开通
    使用mpvue开发小程序教程(五)
    使用mpvue开发小程序教程(四)
    使用mpvue开发小程序教程(三)
    使用mpvue开发小程序教程(二)
    使用mpvue开发小程序教程(一)
    手把手教你用vue-cli构建一个简单的路由应用
    wangEditor
    从列表中或数组中随机抽取固定数量的元素组成新的数组或列表
    js学习总结----核心解读
  • 原文地址:https://www.cnblogs.com/zhangxuan/p/6709962.html
Copyright © 2011-2022 走看看