如何停止 C++ 阻塞读取调用

How to stop a C++ blocking read call

我正在 GNU/Linux 中读取 SocketCAN 和 C++ 下的 CAN-BUS 流量。我发现 read 调用被阻塞了,当我不想继续阅读时,我正在努力弄清楚如何正确停止我的程序。

当然,如果我从终端调用了程序,我可以点击 Ctrl+C,但关键是要找到一种在满足某些条件时以编程方式执行此操作的方法(例如,记录 5秒,或者当某些事件发生时,比如举起旗帜)。超时或信号之类的东西可能会起作用,但我不知道如何正确地做到这一点。

// Read (blocking)
nbytes = read(s, &frame, sizeof(struct can_frame));

读取总是阻塞...您只想在数据正在等待时读取...因此请考虑先在套接字上进行轮询以查看数据是否可用,如果可用则读取它。您可以循环进行民意调查,直到您不再想阅读为止...

bool pollIn(int fd)
{
    bool returnValue{false};
    struct pollfd *pfd;
    pfd = calloc(1, sizeof(struct pollfd));
    pfd.fd = fd;
    pfd.events = POLLIN;

    int pollReturn{-1};
    pollReturn = poll(pfd, 1, 0);

    if (pollReturn > 0)
    {
        if (pfd.revents & POLLIN)
        {
            returnValue = true;
        }
    }
    free(pfd);
    return(returnValue);
}

如果套接字文件描述符处有数据等待,以上应该return。

while(!exitCondition)
{
  if(pollIn(fd))
  {
    nbytes = read(fd, &frame, sizeof(struct can_frame));
    // other stuff you need to do with your read
  }
}

你不知道。

使用selectepoll之类的方法来确定套接字是否有activity before开始read。那么它实际上不会阻塞。

select/epoll 调用本身是阻塞的,但可以给定一个超时,以便您始终有一条逃生路线(或者,在 epoll 的情况下,可爱 epollfd 立即触发突破)。