免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1456 | 回复: 2
打印 上一主题 下一主题

FIFO的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-05-02 17:13 |只看该作者 |倒序浏览
有名管道用于客户/服务器模式,服务器程序建立服务器管道,客户程序向服务器管道写入信息,服务器端读取数据后,向客户程序发送信息,服务器收到了客户端的程序,但是向客户端建立的管道写入数据时发生阻塞,停止运行,无法向客户端管道写入数据,请各位指教
/*------------------------
    FIFO客户与服务器所需的头文件
-------------------------*/
#ifndef FIFO_CS_H
#define FIFO_CS_H
#include<stdio.h>;
#include<fcntl.h>;
#include<stdlib.h>;
#define  SERVER_FIFO_NAME "SFIFO"
#define CLIENT_FIFO_NAME   "C%d"
#endif

/*file :fifo_s.c*/

#include "fifo_cs.h"
void main()
{
        int fdserver;
        int fdclient;
        pid_t cpid,spid;
        char client_fifio_name[32];
       
        /*创建服务器FIFO管道*/
        mkfifo(SERVER_FIFO_NAME,0660);
        if(fdserver=open(SERVER_FIFO_NAME,O_RDWR)==-1)
        {
                 printf("Server :Can not open fifo\n";
                 fflush(stdout);
                 exit(1);
        }
        spid=getpid();
        while(1)
        {
                /*读取客户进程的pid并生成FIFO文件名*/
                read(fdserver,&cpid,sizeof(pid_t));/*阻塞,直到客户进程写入*/
                sprintf(client_fifo_name,CLIENT_FIFO_NAME,cpid);
                /*向客户FIFO管道写入服务器进程pid*/
                if((fdclient=open(client_fifo_name,O_WRONLY))==-1)
                continue;
                write(fdclient,&spid,sizeof(pid_t));
                close(fdclient);       
        }
}
*file :fifo_c.c*/

#include "fifo_cs.h"
void main()
{
     int fdserver;
     int fdclient;
     pid_t cpid,spid;
     char client_fifo_name[32];
     /*打开服务器FIFO管道*/
     if((fdserver=open(SERVER_FIFO_NAME,O_WRONLY))==-1)
     {
             printf("Server not active\n";
             exit(1);
     }
     /*创建并打开客户FIFO管道*/
     cpid=getpid();
     sprintf(client_fifo_name,CLIENT_FIFO_NAME,cpid);
     mkfifo(client_fifo_name,0660);
     if((fdclient=open(client_fifo_name,O_RDWR))==-1)
     {
             close(fdserver);
             printf("Can not open fifo \n";
             exit(1);
     }
     /*写入自身pid,读出服务器pid*/
     write(fdserver,&cpid,sizeof(pid_t));
     read(fdclient,&spid,&spid,sizeof(pid_t));/*阻塞,直到服务器进程写入*/
     
     printf("Client :Get server pid :%d\n",spid);
     
     close(fdserver);
     close(fdclient);
     
     unlink(client_fifo_name);  
}

论坛徽章:
0
2 [报告]
发表于 2005-11-11 13:01 |只看该作者
fifo_s.c 第9行改为:if( (fdserver=open(SERVER_FIFO_NAME,O_RDWR))==-1)

论坛徽章:
0
3 [报告]
发表于 2005-11-11 15:20 |只看该作者
刚看了一下你的程序除了第9行的明显书写错误外
之所以造成你描述的那种情况 和楼主的客户端读服务器的写法错的太不应该
read(fdclient,&spid,&spid,sizeof(pid_t));/*阻塞,直到服务器进程写入*/
语法错误也忒多了吧!请楼主改正运行后再发上来。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP