ここで何を探しているのかわかりません。これを単純にコーディングするのは非常に簡単ですが、この問題は本格的な FSM テーブル駆動型のアプローチに値するようには見えません。
C ライクな疑似コードを次に示します。
double pc = 0.01;
int sensorsfd;
void loop(void) {
for (;;) {
fd_set readfds, writefds, exceptfds;
FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_ZERO(&exceptfds);
FD_SET(sensorsfd, &readfds);
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 1; /* 0.001 seconds */
int r;
send_polling_packet();
r = select(sensorsfd+1, &readfds, &writefds, &exceptfds, &tv);
if (r == -1 && errno == EINTR) {
continue;
} else if (r == -1) {
perror("select() failed");
exit(1);
} else if (r == 0) {
/* timeout expired */
pc = min (pc + 0.01, 1.0);
} else if (r == 1) {
/* sensorsfd won't block when reading it */
packet_t p = read_packet(sensorsfd);
/* should also handle _no packet_ if the sensors
socket returns EOF */
if (packet_corrupted(p)) {
pc /= 2;
} else {
handle_packet(p);
}
} else {
/* error in program logic */
}
}
}
私がこれを書いたばかりで、それをテストするメカニズムがないという意味での疑似コード。プログラムがこれよりもはるかに複雑になる場合は、おそらくすべてのselect(2)セットアップを独自の関数にカプセル化し、センサーのソケットからのパケットの処理のすべての詳細をカプセル化する必要があります。