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

クライアント コードは、中断された場合にのみループを中断します。戻り値をテストし、fgets()それを使用して EOF でループを中断する必要があります。

fpライン バッファリングされた出力として FIFO を使用する保証はありません。fflush(fp)通話後に追加できfputs()ます。

図のように使用する必要はありませんmemset()

クライアントはコマンド ライン引数を使用しないためmain()int main(void).

あなたの主な問題はfflush()、私が信じているものです。他のものはより表面的なものです。


Joachim Pileborgが指摘したように、サーバーは完全に問題がないわけではありません。

問題のサーバー コードは非効率的ですが、任意の数のクライアントにサービスを提供します。ただし、ネストされたループが本当に必要です。外側のループは FIFO を繰り返し開きます。内部は FIFO の内容を読み取ります。内側のループが EOF に達したら、ストリームを閉じて再度開きます。fgets()繰り返しますが、実際にデータを読み取ったことを確認するために、からの戻り値をテストする必要があります。また、サーバーを終了させる方法と、作成した FIFO をサーバーが削除する必要があるかどうかも検討する必要があります。

于 2013-08-13T15:11:35.667 に答える