读取并关闭FD同步,出现问题

时间:2019-07-02 14:02:08

标签: c++

我有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系统调用?

0 个答案:

没有答案