2016-05-03 5 views
1

私はstdinとソケットから同時にデータを待つCプログラムを書こうと思っていました。これを達成するために、poll()を使用したかったのです。stdinとソケットから同時にポーリングするには?

しかし、stdinpoll作品は...私はそれはそれはソケットに振る舞うだけのように振る舞うことが期待どのように私は誤解と思われる、それはされています。私は実際には、端末で何かを入力した(と場合にのみ、好ましくも押された場合POLLINを報告RETURN)。

#include <poll.h> 
#include <stdio.h> 
#include <errno.h> 
#include <string.h> 
#include <unistd.h> 

int main() 
{ 
    int ret_poll; ssize_t ret_read; 
    struct pollfd input[1] = {{fd: 0, events: POLLIN}}; 
    char buff[100]; 
    while(1) { 
    ret_poll = poll(input, 1, 0); 
    printf("ret_poll:\t%d\nerrno:\t%d\nstrerror:\t%s\n", 
     ret_poll, errno, strerror(errno)); 
    ret_read = read(0, buff, 99); 
    printf("ret_read:\t%zd\nerrno:\t%d\nstrerror:\t%s\nbuff:\t%s\n", 
     ret_read, errno, strerror(errno), buff); 
    } 
} 

しかし、私はpollを言ったとき(上記の例では上POLLINを待つことがわかった。この仮定が正しいかどう

をテストするために、私は stdinpoll sがという簡単なプログラムを書きました stdinpollは、実際に何かを入力したかどうかにかかわらず、ただちにすべてを返します。その後、もちろん、 read()stdinブロックに続いています。だから私は、これは私が同時に端末に入力から待つことができないとソケット:(

から、実際に読むためにデータがある場合にのみstdinpollレポートにPOLLINを作ることが可能であることを意味すると思う?

+3

タイムアウトが0に設定されているため、すぐにポーリングが返されませんか?戻り値は0か-1か? – Roecrew

+1

'{{fd:0、events:POLLIN}}'は無効なCの構文です。 – Olaf

+0

@Olaf: '{{.fd = 0、.events = POLLIN}}' - 今はどうですか? – gaazkam

答えて

3

として、あなたは0タイムアウトを与えたので、それはすぐに、@Roecrewにより、上記poll()リターンを述べたmanページが言ったように:。

注タイムアウト間隔がシステム クロック細かに切り上げされ、カーネルのスケジューリング遅延があることを意味していることブロッキング 間隔が少しオーバーランすることがあります。タイムアウトで負の値を指定すると無限のタイムアウトになります。タイムアウト値 をゼロ に指定すると、ファイル記述子が準備できていなくても、すぐにpoll()が返されます。

を変更した場合:あなたが期待通りに動作します ret_poll = poll(input, 1, 0);ret_poll = poll(input, 1, -1);に。

+1

非常に申し訳ありませんが、非常に感謝しています。マニュアルページを読んだことがありますが、何らかの理由でタイムアウトがなかったと誤解しました。私はゼロのタイムアウトを指定すると、無期限に待つ投票が起こったと思った... – gaazkam

関連する問題