2012-04-15 5 views
1

Я работаю над многопоточным кодом pthread, и каждый поток вызывает read() в дескрипторе файла. read() - это блокирующий вызов, поэтому он ждет данных. Но я хочу, чтобы он подождал только 3 секунды, чтобы ждать данных.setTimeOut Эквивалент в c?

Я думал об использовании alarm() и hadling SIGALRM, но если я поднимаю тревогу в одном потоке, все потоки получат сигнал SIGALRM, и все они откажутся от чтения. Как мне это сделать?

ответ

5

Используйте для этого select. У него есть один аргумент, который позволяет вам указать тайм-аут.

В справочной странице Linux для select есть пример использования, и вы найдете множество примеров здесь и в других местах в Интернете.

Если вы не беспокоитесь о переносимости, есть более современные/функциональные варианты.

Вы можете посмотреть в библиотеки абстрагироваться все это. libevent стоит посмотреть и обернуть большинство вышеупомянутых интерфейсов, ориентированных на ОС.

+0

select устарел. epoll - это то, что люди используют в наши дни. –

+0

О, да, я думаю, это должно сработать. Я никогда не рассматривал это использование select() раньше. Я никогда не рассматривал select() для любой другой вещи, кроме мультиплексирования. –

+0

@ VladLazarenko: «устаревшие» - это немного сильная формулировка. 'epoll' не переносится, и' select' не уходит в ближайшее время. Конечно, есть более современные альтернативы, но они также (ИМО) часто сложнее получить право. – Mat