select
code:memo.c
// struct timeval timeout 秒・マイクロ秒単位
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
void FD_CLR(int fd, fd_set *set);
int FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set);
// struct timespec timeout 秒・ナノ秒単位
int pselect(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, const struct timespec *timeout,
const sigset_t *sigmask);
nfds
何個のファイルディスクリプタを監視するか
readfds
読み込みが可能かどうかを監視する用
writefds
停止せずに書き込みが可能かどうかを監視する用
exceptfds
例外の監視
timeout
タイムアウトまでの時間
返り値
readdfs、writedfs、exceptfdsでready状態になったものの総数
code:select.c
int
main(void) {
/* stdin (fd 0) を監視し、入力があった場合に表示する。*/
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(0, &rfds);
/* 最大5秒間監視する。*/
struct timeval tv;
tv.tv_sec = 5;
tv.tv_usec = 0;
/* ここでは1個のファイルディスクリプタ(stdin(0))が読み込み可能かを最大5秒待つ */
int retval = select(1, &rfds, NULL, NULL, &tv);
/* この時点での tv の値を信頼してはならない。*/
if (retval == -1) {
perror("select()");
} else if (retval) {
printf("今、データが取得できました。\n");
/* FD_ISSET(0, &rfds) が true になる。*/
} else {
printf("5 秒以内にデータが入力されませんでした。\n");
}
return 0;
}
確認用
Q. select
Q. pselect
参考
関連