Intereting Posts
Как отключить сжатие в Apache в каком-либо заголовке ответа с сервера приложений прокси-сервера mod_jk У меня есть правило перенаправления index.php в моем htaccess, и теперь, если url содержит index.php / anything, тогда он должен показывать страницу с кодом 404 Почему python проверяет все переменные среды в windowsх делая вложенную папку неограниченной при использовании .htpasswd в apache Как настроить chroot для сборки jenkins? возможно ли отключить функции только для каталога в PHP? Несколько приложений Rails 4 с использованием nginx + unicorn Переназначить www на не-www на сайте https, используя mod rewrite, VirtualHost и / или каталог Невозможно передавать файлы между серверами Как использовать htacces для запуска index.php в подпапке в nginx? Django: только пустая страница Массивные маски процессора (перенос streamов на разные процессоры) Символ objectiveсия в RichTextBox Где APC хранит свой код операции и кеш переменной пользователя? Заполнить memcached сжатыми данными, обслуживать непосредственно из nginx

Linux stat call с таймаутом

Есть ли способ сделать системный вызов системы Linux тайм-аутом?

Я использую распределенную файловую систему, и теоретически на все мои вызовы файловой системы должен быть дан ответ быстро, на практике это не так. После определенного количества времени я предпочел бы иметь тайм-аут и код ошибки, чем продолжать висеть.

Я попробовал отменить запрос в другом streamе, но у него есть некоторые нежелательные взаимодействия с gdb и довольно крутой способ выразить то, что я действительно хочу: тайм-аут.

Предполагая, что вы используете C, и вы можете безопасно SIGALARM обработчик SIGALARM , вы можете использовать код, похожий на этот, только с другим вызовом библиотеки: Может ли statvfs блокироваться на определенных сетевых устройствах? Как справиться с этим делом?

Довольно много вырезать и вставить код и изменить statvfs на stat :

 #include  #include  #include  #include  // alarm handler doesn't need to do anything // other than simply exist static void alarm_handler( int sig ) { return; } . . . // stat() with a timeout measured in seconds // will return -1 with errno set to EINTR should // it time out int statvfs_try( const char *path, struct stat *s, unsigned int seconds ) { struct sigaction newact; struct sigaction oldact; // make sure they're entirely clear (yes I'm paranoid...) memset( &newact, 0, sizeof( newact ) ); memset( &oldact, 0, sizeof( oldact) ); sigemptyset( &newact.sa_mask ); // note that does not have SA_RESTART set, so // stat() should be interrupted on a signal // (hopefully your libc doesn't restart it...) newact.sa_flags = 0; newact.sa_handler = alarm_handler; sigaction( SIGALRM, &newact, &oldact ); alarm( seconds ); // clear errno errno = 0; int rc = stat( path, s ); // save the errno value as alarm() and sigaction() might change it int save_errno = errno; // clear any alarm and reset the signal handler alarm( 0 ); sigaction( SIGALRM, &oldact, NULL ); errno = saved_errno; return( rc ); }