termios シリアル API 経由で使用する FTDI USB シリアル デバイスがあります。read() 呼び出しで (VTIME パラメータを使用して) 0.5 秒でタイムアウトするようにポートを設定しました。これは Linux でも FreeBSD でも機能します。ただし、OpenBSD 5.1 では、データが利用できない場合、read() 呼び出しは単純に永久にブロックされます (以下を参照)。read() は 500 ミリ秒後に 0 を返すと予想します。
少なくともタイムアウト機能に関して、termios API が OpenBSD で異なる動作をする理由を考えられる人はいますか?
編集: タイムアウトなしの問題は、pthread に対するリンクによって発生します。実際に pthread やミューテックスなどを使用しているかどうかに関係なく、単にそのライブラリにリンクすると、VTIME 設定に基づいてタイムアウトするのではなく、read() が永久にブロックされます。繰り返しますが、この問題は OpenBSD でのみ発生します -- Linux と FreeBSD は期待どおりに動作します。
if ((sd = open(devPath, O_RDWR | O_NOCTTY)) >= 0)
{
struct termios newtio;
char input;
memset(&newtio, 0, sizeof(newtio));
// set options, including non-canonical mode
newtio.c_cflag = (CREAD | CS8 | CLOCAL);
newtio.c_lflag = 0;
// when waiting for responses, wait until we haven't received
// any characters for 0.5 seconds before timing out
newtio.c_cc[VTIME] = 5;
newtio.c_cc[VMIN] = 0;
// set the input and output baud rates to 7812
cfsetispeed(&newtio, 7812);
cfsetospeed(&newtio, 7812);
if ((tcflush(sd, TCIFLUSH) == 0) &&
(tcsetattr(sd, TCSANOW, &newtio) == 0))
{
read(sd, &input, 1); // even though VTIME is set on the device,
// this read() will block forever when no
// character is available in the Rx buffer
}
}