当前位置:  技术问答>linux和unix

关于LINUX有名管道的多路复用问题

    来源: 互联网  发布时间:2017-03-18

    本文导语:  我的意思是说,用有名管道来实现,命名管道文件只有1个,所有的进程用读写模式打开。其中1个进程相当于服务器的角色,从管道中读取后,将一定的数据回送给发送方,比如可以原封不动的将收到的报文回送。其...

我的意思是说,用有名管道来实现,命名管道文件只有1个,所有的进程用读写模式打开。其中1个进程相当于服务器的角色,从管道中读取后,将一定的数据回送给发送方,比如可以原封不动的将收到的报文回送。其他进程分别对这个有名管道写数据,写完了后就读回应。假如S是这个类似服务器角色的进程,S读到C1进程写进管道的内容后,应该向管道中回写,C1读这个管道,应该收到内容。同理C2、C3也这么做,这样就有个问题,C1/C2/C3收到的报文必须是正确的发送给自己的,而不能读到其他的。这样怎么实现?
目前这个S端的程序是这样的,没有用到SELECT
#include 
#include 
#include 
#include 
#include 

#define FIFO "/tmp/myfifo"

main(int argc,char** argv)
{
    char buf_r[100];
    int  fd; 
    int  nread;
    pid_t pid;

    if((mkfifo(FIFO,O_CREAT|O_EXCL) 0)
            {
                printf("now send backn");
                nread = write(fd,buf_r,100);
                printf("send %d bytes backn",nread);
            }
            sleep(1);
        }
        pause();
        unlink(FIFO);
    }
}

C1这么写:
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define FIFO_SERVER "/tmp/myfifo"

main(int argc,char** argv)
{
    int fd; 
    char w_buf[100];
    int nwrite;
    
    //fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0);
    fd=open(FIFO_SERVER,O_RDWR,0);
    
    if(argc==1)
    {   
        printf("Please send somethingn");
        exit(-1);
    }   
    
    strcpy(w_buf,argv[1]);
    
    if((nwrite=write(fd,w_buf,100))==-1)
    {   
        if(errno==EAGAIN)
            printf("The FIFO has not been read yet.Please try latern");
    }   
    else 
        printf("write %s to the FIFOn",w_buf);
    sleep(1);
    memset(w_buf,0x0,sizeof(w_buf));
    nwrite = read(fd,w_buf,100);
    printf("read back,%sn",w_buf);
}
这个程序可以正确的运行,因为只有1对读写进程。如果fork2次,用execl执行2次C,则可以在C端看到发送和接收是混乱的
解决思路是用SELECT进行多路转接吗?如何实现呢?试图写了2个版本,只能实现1对进程的正确读写,另一个进程却阻塞了,貌似并不是SELECT在正确工作
分不多,真的只有这么多了

|
一个FIFO是做梦。

APUE上标准实现是:

1,服务端创建一个众所周知的监听FIFO。
2,客户端启动后创建各自的FIFO,FIFO的路径以pid命名,之后向服务端的FIFO写入自己的PID。
3,服务端检测到监听FIFO可读,就读取其中的PID,并打开这些PID对应的FIFO加入到检测集。
4,客户端可以向自己的FIFO读写数据,服务端可以检测到每个客户端的FIFO的数据读写。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux管道问题,管道建立后如何同步?
  • 哪位大侠知道Linux里的有名管道传送数据快不快?有名管道操作的过程是否有读写硬盘的操作?
  • 1哪位大侠知道Linux里的有名管道传送数据快不快?有名管道操作的过程是否有读写硬盘的操作?
  • Linux下面的"匿名管道",是否对应着某种实体?
  • linux进程管道通信
  • linux 管道通信
  • linux shell如何非阻塞写命名管道
  • 关于linux下管道的概念性问题
  • linux管道应用场景
  • 关于linux下管道的一个问题
  • windows下编程中有没有linux编程中管道和信号的概念?
  • 管道符号|命令在uninx和linux下边有什么区别吗?
  • 关于linux 下使用管道问题
  • linux C语言 管道pipe的问题
  • 关于linux下管道的问题
  • linux下的管道mkfifo??????
  • linux 下mkfifo ,读管道,所得字符串总是乱码
  • 这是一个关于Linux的管道的程序,请问一下这个程序是什么意思,能不能解释一下
  • 求解惑,Linux管道和重定向
  • linux进程间通信(管道)的问题
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3