4

月曜日に研究室に行く前に、FIFO とこの低レベル I/O についての洞察を得ようとしてきましたが、よくわからないこの状況に陥りました。

プログラムは次のことを行う必要があります。

サーバ:

  • FIFOを作成し、
  • 5 つのメッセージを送信します: "Message #i"、5 秒間隔で、
  • FIFOを削除し、

クライアント:

  • FIFO から読み取り、メッセージを表示します。
  • メッセージが 6 秒間ない場合は終了します。

そしてそれは通信しますが、クライアントは私が彼に送ったものとまったく同じではなく、さらに重要なことに、新しいメッセージが到着するたびに最初から読んでいるようです. 私はかなり長い間理解しようとしてきましたが、ドキュメントの内容と一致していないようです...助けてください! :(

サーバ

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>  
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc, char* argv[])
{       
    int s2c, c2s, i; 
    char fifo_name1[] = "/tmp/fifo1";
    char fifo_name2[] = "/tmp/fifo2";
    char msg[80], buf[10];
    struct stat st;

    // if no fifos, create 'em
    if (stat(fifo_name1, &st) != 0)
        mkfifo(fifo_name1, 0666);
    if (stat(fifo_name2, &st) != 0)
        mkfifo(fifo_name2, 0666);

    s2c= open(fifo_name1, O_WRONLY);
    c2s= open(fifo_name2, O_RDONLY);

    // start sending messages, with 5s interval
    for (i=0; i<5; i++)
    {
        printf("Message #%d \n", i);

        strcat(msg, "Message #"); 
        strcat(msg, itoa(i, buf, 10));
        strcat(msg, "\0"); 

        write(s2c, msg, strlen(msg)+1);

        sleep(5);
    }

    // delete fifos
    unlink(fifo_name1);
    unlink(fifo_name2);
    printf("server exit successfully");
    return EXIT_SUCCESS;
}

クライアント

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
    int c2s, s2c, c=0;
    char buf[10];

    char fifo_name1[] = "/tmp/fifo1";
    char fifo_name2[] = "/tmp/fifo2";
    s2c= open(fifo_name1, O_RDONLY);
    c2s= open(fifo_name2, O_WRONLY);

    // receive messages
    while (1)
    {
        if (read(s2c, &buf, sizeof(char)*10) > 0)
        {
            printf("%s \n", buf);
            c=0;
        }
        sleep(1);
        c++;    
        if (c>6) 
            break;
    }

    printf("client exit successfully");
    return EXIT_SUCCESS;
}       
4

1 に答える 1

4

strcat(msg, "Message #");は、すでに にある文字列の末尾に常に追加msgされ、ループ中に文字列がリセットされることはありません。strcpy(msg, "Message #");新しいメッセージを最初から開始するには、 に置き換えます。

于 2013-01-05T15:37:04.997 に答える