selectを用いたstdin(標準入力)の監視


selectを使用すると、複数のファイルディスクリプタを監視することができる。ソケットプログラミングでは受信チェックのためにFDの監視を行う必要があるので、selectにはお世話になっている。今日はこのFDを用いて、stdin(標準入力)の監視にチャレンジしてみた。

int CanIRecv(int fd){ 
	fd_set fdset;
	struct timeval timeout;
	FD_ZERO( &fdset ); 
	FD_SET( fd , &fdset );
	timeout.tv_sec = 0; 
	timeout.tv_usec = 0;
	return select( fd+1 , &fdset , NULL , NULL , &timeout );
}

これがselectを用いた受信チェック関数。仕組みとして、引数と与えられたファイルディスクリプタタイムアウト0秒でチェックする。タイムアウトが0になっているので、関数はすぐに戻ってくる。戻り値が真となれば、受信可能なデータが対象FDに溜まっている。

ということで、FDを0(stdin)で試してみた。プログラムが以下のとおり。

/* Stdin(キーボード入力)の監視 */
if(CanIRecv(0)){
	memset(read_buf, '\0', BUFSIZ);
	read(0,read_buf, BUFSIZ);
	printf("RECV=[%s]\n",read_buf);
	if(strcmp(read_buf,"test\n")==0){
		printf("***TEST***\n");
	}
}

とりあえず、このような感じで。BUFSIZはstdio.h内で定義されている。(適当に確保してください)文字を入力しエンターキーを叩いた瞬間に無事実行された。エンターキーを叩くことによって、データが貯まるようだ。read関数でデータを取得。入力された文字コードだけではなく改行コード(\n)までふくんでいるようだ。ということで、これを使えばノンブロッキングで標準入力ができる。
正直、C言語については一通りやってきたけど、標準入出力とか今まであまり意識したことがなく、ソケットプログラミングを初めて初めてファイルディスクリプタを意識し始めた。C言語上でのファイルの扱いやふるまい、ストリームの仕組み、OSとのやりとり等を詳しく解説した参考書とかってないのかな・・。

今日は、人工衛星のシステム図を図書館で印刷して、同じシステム系の仲間と確認作業をした。テスト期間を挟んで、3週間ほどのブランクが発生したので、結構忘れてたやばい。これから全力で開発を再開していこー