0

我只是在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);
}
4

1 回答 1

1

您的客户端代码仅在被中断时才中断循环——您应该测试 from 的返回值fgets()并使用它来中断 EOF 上的循环。

不能保证 FIFO 作为fp行缓冲的输出;您可以fflush(fp)fputs()通话后添加。

memset()如图所示,无需使用。

由于客户端不使用它的命令行参数,它main()应该是int main(void).

我相信你的主要问题是fflush()一个;其他的更接近化妆品。


正如Joachim Pileborg所指出的,服务器并非完全没有问题。

问题中的服务器代码虽然效率低下,但将为任意数量的客户端提供服务。但是,您确实需要嵌套循环。外循环反复打开FIFO;内部读取 FIFO 的内容。当内部循环到达 EOF 时,是时候关闭流并重新打开它了。同样,您需要测试 from 的返回值fgets()以确保您实际读取数据。您还应该考虑如何让服务器退出,以及服务器是否应该删除它创建的 FIFO。

于 2013-08-13T15:11:35.667 回答