0

client.cのread_from_fifo関数のn_bytesがfifoに書き込まれた値に対応しない理由のデバッグに問題があります。25バイトしか書き込まないはずですが、さらに多くの読み取りを試みます(正確には、1836020505バイト(!))。なぜこれが起こっているのか考えていますか?

server.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <signal.h>
#include <pthread.h>
#include <sys/stat.h>

typedef enum { false, true } bool;

//first read the int with the number of bytes the data will have
//then read that number of bytes
bool read_from_fifo(int fd, char* var)
{
    int n_bytes;
    if (read(fd, &n_bytes, sizeof(int)))
    {
        printf("going to read %d bytes\n", n_bytes);
        if (read(fd, var, n_bytes))
            printf("read var\n");
        else {
            printf("error in read var. errno: %d\n", errno);
            exit(-1);
        }
    }

    return true;
}

int main()
{
    mkfifo("/tmp/foo", 0660);
    int fd = open("/tmp/foo", O_RDONLY);
    char var[100];
    read_from_fifo(fd, var);
    printf("var: %s\n", var);
    return 0;
}

client.c:

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

typedef enum { false, true } bool;

//first write to fd a int with the number of bytes that will be written afterwards
bool write_to_fifo(int fd, char* data)
{
    int n_bytes = (strlen(data)) * sizeof(char);
    printf("going to write %d bytes\n", n_bytes);
    if (write(fd, &n_bytes, sizeof(int) != -1))
        if (write(fd, data, n_bytes) != -1)
            return true;
    return false;
}


int main()
{
    int fd = open("/tmp/foo", O_WRONLY);
    char data[] = "some random string abcdef";
    write_to_fifo(fd, data);
    return 0;
}

ヘルプは大歓迎です。前もって感謝します。

4

3 に答える 3

0

read_from_fifo()関数によって出力されたnbytesが正しい値を表示したかどうかを確認しましたか?write(fd、data、n_bytes)で、文字列char'\ 0'の終わりを書き込まず、read(fd、var、n_bytes)で読み取るたびに、'\0'を追加しなかったことに注意してください。文字列の最後まで読み取るだけなので、printf( "var:%s \ n"、var); \ 0で終了していない文字列を表示すると、予期しない結果が生じる可能性があります。

于 2010-05-30T01:28:05.267 に答える
0

からのエラーの戻り値read(2)は0ではなく-1です。したがって、少なくとも最初の4バイト読み取りのifステートメントは間違っています。

于 2010-05-30T01:07:57.133 に答える
0

私は自分で解決策を見つけました。

問題は')'信じられないかもしれません。n_bytes変数は正しいですが、問題はそれをFIFOに書き込んでいないことです。

これ(write(fd, &n_bytes, sizeof(int) != -1))

これである必要があります(write(fd, &n_bytes, sizeof(int)) != -1)

とにかくあなたの答えをありがとう。

于 2010-05-30T11:39:23.013 に答える