我有IPC
通道,主要用于传输CAN
数据。
我正在通过open
通话打开频道,如下所示。
int handle;
bool Iopen()
{
handle = open("/dev/ipc16", O_RDWR);
return handle != -1;
}
并通过close
调用关闭频道,如下所示。
void close()
{
close(handle);
}
下面有thread
确实在频道上阻塞了read
。
void *ipcReaderFunction(void *p)
{
IpcChannel *pIpcChannel = NULL;
pIpcChannel = static_cast<IpcChannel*>(p);
if(pIpcChannel == NULL)
{
return NULL;
}
for (;;)
{
std::array<std::uint8_t, BUFFER_SIZE> buffer;
const auto size = read(handle, buffer.data(), buffer.size());
if (-1 == size) {
if (EBADF == errno) {
//Channel is closed
break;
}
continue;
}
.....
//some processing
.....
}
}
启动和停止阅读器线程。
void startIPCReaderThread()
{
int ret = -1;
ret = pthread_create(&mIPCReaderThread , NULL, &ipcReaderFunction, this);
}
void stopIPCReaderThread()
{
int ret = -1;
ret = pthread_join(mIPCReaderThread, NULL);
}
我的问题:
if (EBADF == errno) {
//Channel is closed
break;
}
接收到某些事件后,我将首先关闭通道,然后按如下所示停止读取器线程。
close();
stopIPCReaderThread();
由于read
的调用被阻止,读取器线程将不会立即停止,并且一段时间后它会以EBADF
errno返回-1。
依靠EBADF
errno是个好主意还是让我使用select
系统调用?