Зависает read

Модератор: Модераторы разделов

IMB
Сообщения: 2567
ОС: Debian

Зависает read

Сообщение IMB »

Доброго дня!
В SDK производителя есть такая фукция:

Код: Выделить всё

Int Fifo_get(Fifo_Handle hFifo, Ptr ptrPtr)
{
    printf("Starting %s\n", __FUNCTION__);
    Int flush;
    Int numBytes;

    assert(hFifo);
    assert(ptrPtr);

    pthread_mutex_lock(&hFifo->mutex);
    flush = hFifo->flush;
    printf("Flush = %d\n", flush);
    pthread_mutex_unlock(&hFifo->mutex);

    if (flush) {
        return Dmai_EFLUSH;
    }

    printf("numBytes = %d, size Ptr = %d\n", numBytes, sizeof(Ptr));
    printf("read from fd %d\n", hFifo->pipes[0]);
    numBytes = read(hFifo->pipes[0], ptrPtr, sizeof(Ptr));
    printf("after read: numBytes = %d, size Ptr = %d\n", numBytes, sizeof(Ptr));

    if (numBytes != sizeof(Ptr)) {
        pthread_mutex_lock(&hFifo->mutex);
        flush = hFifo->flush;
        printf("Flush = %d\n", flush);
        if (flush) {
            hFifo->flush = FALSE;
        }
        pthread_mutex_unlock(&hFifo->mutex);

        if (flush) {
            return Dmai_EFLUSH;
        }
        return Dmai_EIO;
    }

    printf("numBufs = %d\n", hFifo->numBufs);
    pthread_mutex_lock(&hFifo->mutex);
    hFifo->numBufs--;
    printf("numBufs = %d\n", hFifo->numBufs);
    pthread_mutex_unlock(&hFifo->mutex);

    return Dmai_EOK;
}

Описание фукции - Blocking call to receive a buffer pointer from a fifo.
Вызов printf вставил я для отладки, так как на вызове данной фукции программа "зависает".
Результат использование фукции:

# ./prog

Starting Fifo_get Flush = 0 numBytes = 1074548884, size Ptr = 4 read from fd 5

Вопрос - что может вызыватать "зависание" read, думаю на read т.к. не вижу дальнейшей работы фукции, и как это можно решить?
Спасибо.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Зависает read

Сообщение frp »

IMB писал(а):
04.05.2010 15:47
Вопрос - что может вызыватать "зависание" read, думаю на read

По дефолту если в потоке (fifo, каналы, сокеты, устройства) нет данных, то read ждет пока они там появятся. Отключить такое поведение можно при помощи функции fcntl:

Код: Выделить всё

fcntl(fd, F_SETFL, O_NONBLOCK);

После этого read в случае отсутствия данных в потоке будет возвращать 0.
Подробнее - man fcntl.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Зависает read

Сообщение eddy »

Можно сразу открывать FIFO с обеих сторон в неблокирующем режиме. Чтобы пишущий процесс не блокировался, пока не появится читающий, лучше всего открыть в пишущем процессе FIFO так:

Код: Выделить всё

mkfifo("fifo", 0666);
int file = open("fifo", O_RDWR|O_NONBLOCK);
FILE* outfile = fdopen(file, "w+");

man fifo.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали: