2012-05-19 3 views
2

Есть ли способ удержать fwrite от блокировки, например, используя таймауты?Тайм-аут вызовите fwrite, чтобы он не блокировался

Сценарий таков: мне нужно сделать вызов fwrite (поскольку я в основном повторно использую код, я должен придерживаться его) в сети. Однако, если я вытаскиваю сетевой кабель, блокируются. Есть ли обходной путь? Любая помощь/предложения будут высоко оценены.

+0

Ваша ОС будет поддерживать его. Не стандартные библиотеки C или C++. –

+0

Код будет работать на linux, в основном ubuntu – neorg

+0

Поместите его в свой вопрос, а не комментарий, и используйте нужные теги. –

ответ

1

Вы можете настроить обработчик сигналов и использовать системный вызов alarm(), чтобы запланировать доставку этого сигнала, что прервет вызов fwrite(). Типичное использование будет выглядеть примерно так:

signal(SIGALRM, handle_sigalrm); 
received_alarm = 0; 
alarm(10); 
...some blocking operation... 
alarm(0); // cancel the alarm. 
if (received_alarm) { 
    // command timed out 
} else { 
    // command completed successfully 
} 

Это предполагает, что handle_sigalrm() является функцией, которая устанавливает глобальную переменную received_alarm при вызове. Google имеет несколько примеров.

Это абсолютно не лучший способ справиться с этим, но это может быть ваш единственный вариант, если вы вынуждены использовать fwrite(). Лучшим решением является использование цикла select() или poll() и неблокирующих сокетов, но для этого может потребоваться существенная реорганизация вашего кода.

3

коммутировать основной дескриптор файла неблокирующего режима:

int fd = fdnum(stream); 
int f = fcntl(fd, F_GETFL, 0); 
f |= O_NONBLOCK; 
fcntl(fd, F_SETFL, f); 

После этого вызов fwrite() будет немедленно вернуться и установить errno в EAGAIN, если дескриптор файла не готов к записываются. Вызывая его в цикле и используя сон, вы можете легко реализовать любое требуемое время ожидания.