2012-04-15 77 views
1

我正在研究一個pthread多線程代碼,每個線程正在調用一個文件描述符上的read()。 read()是一個阻塞調用,因此它等待數據。但是我希望它只等3秒鐘等待數據。setTimeOut在c中等效嗎?

我想過使用alarm()和肆意SIGALRM,但如果我在一個線程中發出警報,所有線程都會獲得該SIGALRM信號,並且它們都將放棄讀取。我該怎麼做?

回答

5

使用select呼叫。它有一個參數可以讓你指定超時。

select的Linux手冊頁有一個示例用法,您可以在此處或網絡上的其他地方找到大量示例。

如果您不擔心可移植性,那麼有更多現代/有特色的選項。

你可能要考慮庫抽象了這一切,。 libevent值得一看,幷包裝了大部分上述操作系統特定的接口。

+0

select已棄用。 epoll是人們現在使用的東西。 – 2012-04-15 06:22:10

+0

哦,是的,我認爲這應該工作。我從來沒有考慮過使用select()之前。除了多路複用之外,我從未考慮過select()。 – 2012-04-15 06:24:23

+0

@ VladLazarenko:「棄用」對此有點強烈的措辭。 'epoll'不是便攜式的,'select'不會很快消失。當然還有更多現代化的選擇,但他們也(IMO)往往難以正確。 – Mat 2012-04-15 06:26:11