当前位置: 技术问答>linux和unix
FIFO的问题
来源: 互联网 发布时间:2015-09-26
本文导语: 有名管道用于客户/服务器模式,服务器程序建立服务器管道,客户程序向服务器管道写入信息,服务器端读取数据后,向客户程序发送信息,服务器收到了客户端的程序的信息,但是向客户端建立的管道写入数据时...
有名管道用于客户/服务器模式,服务器程序建立服务器管道,客户程序向服务器管道写入信息,服务器端读取数据后,向客户程序发送信息,服务器收到了客户端的程序的信息,但是向客户端建立的管道写入数据时发生阻塞,停止运行,无法向客户端管道写入数据,请各位指教
/*------------------------
FIFO客户与服务器所需的头文件
-------------------------*/
#ifndef FIFO_CS_H
#define FIFO_CS_H
#include
#include
#include
#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 fifon");
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 activen");
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 :%dn",spid);
close(fdserver);
close(fdclient);
unlink(client_fifo_name);
}
/*------------------------
FIFO客户与服务器所需的头文件
-------------------------*/
#ifndef FIFO_CS_H
#define FIFO_CS_H
#include
#include
#include
#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 fifon");
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 activen");
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 :%dn",spid);
close(fdserver);
close(fdclient);
unlink(client_fifo_name);
}
|
write(fdclient,&spid,sizeof(pid_t));
read(fdclient,&spid,&spid,sizeof(pid_t));/*阻塞,直到服务器进程写入*/
写入的东西和读的不配额...
还有你的服务端不能长时间监听客户端的连接,,就是当全部客户端连接完后,再去连接就不行了.
read(fdclient,&spid,&spid,sizeof(pid_t));/*阻塞,直到服务器进程写入*/
写入的东西和读的不配额...
还有你的服务端不能长时间监听客户端的连接,,就是当全部客户端连接完后,再去连接就不行了.
|
帮你顶一下