![読み書き時間と数を選択するには? [閉鎖]](https://linux33.com/image/47104/%E8%AA%AD%E3%81%BF%E6%9B%B8%E3%81%8D%E6%99%82%E9%96%93%E3%81%A8%E6%95%B0%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%EF%BC%9F%20%5B%E9%96%89%E9%8E%96%5D.png)
このプログラムは一度だけ待機しますが、その理由を知りません。実際、この質問はトピックから逸脱した質問として残してはいけないと思います。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/select.h>
#include <unistd.h>
int main(void)
{
fd_set set;
struct timeval timeout;
int rv;
char buff[100];
int len = 100;
int filedesc = open( "/dev/ttyS0", O_RDWR );
int filedesc1 = filedesc + 1;
timeout.tv_sec = 5;
timeout.tv_usec = 10000;
while(1) {
printf("begin:\n");
FD_ZERO(&set); /* clear the set */
FD_SET(filedesc, &set); /* add our file descriptor to the set */
rv = select(filedesc1, &set, NULL, NULL, &timeout);
if(rv == -1)
perror("select\n"); /* an error accured */
else if(rv == 0)
printf("timeout\n"); /* a timeout occured */
else
read( filedesc, buff, len ); /* there was data to read */
}
}
答え1
Select
マンページから:
Linuxでは、select()は眠っていない時間を反映するようにタイムアウトを変更します。他のほとんどの実装ではこれを行いません。 (POSIX.1-2001 は両方の動作を許可します.)
最初のタイムアウトが発生した後のtimeout
残りのスリープ時間を反映するように変数が更新されました。これは、5.01秒全体を待機したため、0です。
select
最後のパラメータがどのように宣言されていないかを確認してくださいconst
。
その後 5.01 秒間再び待機するには、次のコードを移動する必要があります。
timeout.tv_sec = 5;
timeout.tv_usec = 10000;
...while
ループの内部。