проблема с fifos linux - PullRequest
       20

проблема с fifos linux

0 голосов
/ 30 мая 2010

У меня проблемы с отладкой, почему n_bytes в функции read_from_fifo в client.c не соответствует значению, записанному в 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;
}

Помощь очень ценится. Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 30 мая 2010

Проверяли ли вы, что nbytes, напечатанные функцией read_from_fifo (), отображают правильное значение? Просто обратите внимание, что при записи (fd, data, n_bytes) вы не записали конец строки char '\ 0', и всякий раз, когда вы читали ее с помощью read (fd, var, n_bytes), вы не добавляли '\ 0' до конца строки просто читаем, поэтому printf ("var:% s \ n", var); может отображать не завершенную \ 0 строку, приводящую к непредсказуемым результатам.

0 голосов
/ 30 мая 2010

Я нашел решение сам.

Проблема в том, что ")", хотите верьте, хотите нет. Переменная n_bytes верна, проблема в том, что я не пишу это в fifo.

это (write(fd, &n_bytes, sizeof(int) != -1))

должно быть это (write(fd, &n_bytes, sizeof(int)) != -1)

В любом случае, спасибо за ваши ответы.

0 голосов
/ 30 мая 2010

Возвращаемое значение для ошибки из read(2) равно -1, а не 0. Поэтому ваш оператор if для первого 4-байтового чтения, по крайней мере, неверен.

...