我只是在Ubuntu中进行了命名管道的实验,但是服务器无法接收我在客户端输入的字符串,我该如何解决呢?当我在客户端按Ctrl + C时,服务器可以接收一些字符。
服务器
#include<stdio.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<unistd.h>
#include<linux/stat.h>
#define FIFO_FILE "sampleFIFO"
int main()
{
FILE *fp;
char readbuf[80];
umask(0);
mknod(FIFO_FILE,S_IFIFO|0666,0);
while(1)
{
fp = fopen(FIFO_FILE,"r");
fgets(readbuf,80,fp);
printf("Received:%s\n",readbuf);
fclose(fp);
}
return(0);
}
客户端
#include<stdio.h>
#include<stdlib.h>
#define FIFO_FILE "sampleFIFO"
int main(int argc,char *argv[])
{
FILE *fp;
char buf[80];
if((fp = fopen(FIFO_FILE,"w")) == NULL)
{
perror("error");
exit(1);
}
while(1)
{
memset(buf,0,sizeof(buf));
fgets(buf,80,stdin);
fputs(buf,fp);
}
fclose(fp);
return(0);
}
答案 0 :(得分:1)
您的客户端代码仅在中断时才会中断循环 - 您应该从fgets()
测试返回值并使用它来打破EOF循环。
无法保证将FIFO作为fp
线路缓冲的输出;您可以在fflush(fp)
来电后添加fputs()
。
如图所示,无需使用memset()
。
由于客户端不使用其命令行参数,因此main()
应为int main(void)
。
我认为你的主要问题是fflush()
;其他人更接近化妆品。
正如Joachim Pileborg所指出的那样,服务器并非完全无问题。
问题中的服务器代码虽然效率低下,但却可以为任意数量的客户端提供服务。但是,您确实需要嵌套循环。外环重复打开FIFO;内部读取FIFO的内容。当内循环到达EOF时,是时候关闭流并重新打开它。同样,您需要测试fgets()
的返回值,以确保您实际读取数据。您还应该考虑如何使服务器退出,以及服务器是否应该删除它创建的FIFO。