LINUX.ORG.RU

non-blocking write


0

1

Почему данный вызов write блокируется?..

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


const int SIZE = 1024*1024*512;

int main() {

    char* buf = (char*) malloc(SIZE);
    if (buf == NULL) {
        fprintf(stderr, "Can't allocate memory!\n");
        exit(1);
    }
    memset(buf, 0, SIZE);

    remove("test.tmp");

    int fd = open("test.tmp", O_WRONLY|O_CREAT|O_NONBLOCK);
    printf("Writing...\n");
    write(fd, buf, SIZE);
    printf("Done!\n");
    close(fd);

    return 0;
}
★★★★★

Ответ на: комментарий от Deleted

гм. где почитать подробнее? если так, то похоже остается ещё два варианта решения задачи - aio_write или запись в отдельном треде... эх...

ei-grad ★★★★★
() автор топика

Не блокируется, он просто записывает.

anonymous
()

Может и тупая идея, но всё же: а система, на которую пишется этот файл часом не подмонтирована с SYNC флагом?

velikS
()
Ответ на: комментарий от velikS

Нет. Но даже если бы была, то всё равно write принципиально должен работать по-другому с файлом который открыт с O_NONBLOCK... Но похоже cryptonymous прав, и O_NONBLOCK действительно игнорируется на обычных файлах.

ei-grad ★★★★★
() автор топика
Ответ на: комментарий от Deleted

О, спасибо! Натыкался на эту страничку пока гуглил самостоятельно, но просмотрел бегло и подумал что не о том. Вот ведь блин, пока кто-нибудь не ткнёт носом, не вчитываешься :-).

An alternative, of course, involves reading small chunks of data at once, and handling other events in-between. Then again, even reading a single byte can take a long time, if said byte could not be read ahead.

О, а это кстати вариант.

ei-grad ★★★★★
() автор топика
Ответ на: комментарий от ei-grad

Именно, ты просто от O_NONBLOCK ждешь того чего он не делает. Файл всегда доступен на чтение и запись и ты никогда не получишь EWOULDBLOCK.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.