この人頭いいなと思ったエピソード

keventを使って標準入力の監視を行おうとしているのですが、タイムアウト時間を指定してもタイムアウトが働きません。
___struct timespec timeout;
___timeout.tv_sec = 0;
___timeout.tv_nsec = 0;

___EV_SET(&kev, fd, EVFILT_READ, EV_ADD, 0, 0, &timeout);
___ret = kevent(kq,&kev,1,NULL,0,NULL);
___printf("eventを待ちます\n");
___c = kevent(kq,NULL,0,&kev2, 1, &timeout);
___printf("監視終了\n");
としてfd(標準入力)を監視しています。標準入力を入れると反応するので監視自体は出来ているのですが、
何も入れなかった場合、タイムアウトせずにそのままキー入力があるまで待ち続けているみたいです。
タイムアウトの指定のやり方に間違いがあれば教えて欲しいです。

A 回答 (4件)

試しにこっちでも作ってみました。


結果として言えそうなことは、
・EV_SETの第2引数(ident)が正しくない(監視対象stdinを示すfdでない)
・タイムアウトは何か値を入れないとまずそう(manでは0/0はポーリングと書いてあるが即時タイムアウトしなかった)
というところですね。

環境はFreeBSD7.0 / gcc4.2です。

#include <stdio.h>
#include <sys/types.h>
#include <sys/event.h>
#include <sys/time.h>

int main(void)
{
 int r;
 struct kevent kset, kget;
 struct timespec tout;
 int kq = kqueue();

 if(kq == -1)
 {
  perror("kqueue");
  return -1;
 }

 EV_SET(&kset, 0, EVFILT_READ, EV_ADD, 0, 0, NULL);
 r = kevent(kq, &kset, 1, NULL, 0, NULL);
 if(r == -1)
 {
  perror("kqueue");
  return -1;
 }

 printf("wait for keyboard...\n");

 tout.tv_sec = 1;
 tout.tv_nsec = 0;

 r = kevent(kq, NULL, 0, &kget, 1, &tout);
 if(r == -1)
 {
  perror("kqueue");
  return -1;
 }else if(r == 0){
  printf("time out.\n");
 }
 close(kq);
}
 
なお、標準入力はEnter入力までは「読み込み可」にならないようです。
    • good
    • 0
    • good
    • 0

あー、EV_SETの第6引数にtimeoutのポインタ渡したら「何とも知れないモノ」に書き変わるような。


NULLでいいんじゃないですか?

この回答への補足

ご指摘ありがとうございます!
kevent()とごっちゃになって入れてたみたいです。
ただ、残念ながらここを直しても動作は変わりませんでした。

補足日時:2011/02/11 13:40
    • good
    • 0

timeoutの指定が0ってのは通常「無期限」を指すような気がします。

この回答への補足

そう思って、tv_secを1にしたりtv_nsecを5000にしたりしてみたのですが、結果は変わりませんでした…。

補足日時:2011/02/11 12:22
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!