我有一個通過termios串行API使用的FTDI USB串行設備。我設置了端口,以便它在半秒內(通過使用VTIME參數)在read()調用上超時,並且這在Linux和FreeBSD上都可以工作。然而,在OpenBSD 5.1中,當沒有數據可用時,read()調用會永遠阻塞(見下文)。我期望在500ms後read()返回0。OpenBSD串行I/O:即使使用termios VTIME進行設置,-lpthead也會永久保留read()塊?
任何人都可以想到termios API在OpenBSD下表現不同的原因,至少就超時功能而言?
編輯:無超時問題是由對pthread鏈接引起的。無論我是否實際使用任何pthread,mutexes等,只需鏈接到該庫,都會導致read()永久阻塞,而不是基於VTIME設置進行超時。同樣,這個問題只在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
}
}
您使用的是-pthread還是-lpthread? – ramrunner
對不起,我只是再次看到標題;) – ramrunner
你可以嘗試OpenBSD 5.2,我們切換到默認地址?在我的5.3系統上,你的例子不會阻塞。實測值/ AMD64。 – ramrunner