如何在vxworks或linux上取消阻止的read / recvfrom系统调用

时间:2013-07-22 06:51:24

标签: c linux unix vxworks

TASK I

...

while (1)
{
  if (running == false)
  break;
  ret = read(fd, buf, size); /* Or: ret = recvfrom(sock, buf, size, 0, NULL, NULL); */
  ...
 }

任务II

...
running = true;
/* ioctl(fd, FIOCANCEL, 0); */
close(fd);   /* Or: close(sock);*/

任务II 应该做什么来取消阻止的任务我

vxworks 中,有一个函数ioctl(fd, FIOCANCEL, 0)可以取消阻止的读取或写入,但它无法正常工作。可能是因为司机不能支持“FIOCANCEL”

如何在vxworks和linux中编写任务II?或者还有其他办法来完成我的任务吗?

2 个答案:

答案 0 :(得分:0)

在linux上取消读取/接收来电是不可能。您无法使用相同的API编写这些任务。在Linux上,您可以使用epoll和O_NONBLOCK来创建取消read / recvfrom的语义。

对于linux和vxworks,使用相同的代码执行此操作不可能

答案 1 :(得分:-1)

不要使用阻塞IO,这是创建没有(可达)退出条件的线程的经典案例,我认为这是一个错误。如何运行线程的最简单示例如下:

volatile bool _threadRunning = true;

void taskI()
{
    int flags = fcntl(fd, F_GETFL, 0);
    fcntl(fd, F_SETFL, flags | O_NONBLOCK);

    while (_threadRunning == true)
    {
        ret = read(fd, buf, size);
        if (ret > 0)
        {
            // process buffer
        }
        else
        {
            // sleep for 1 millisecond or so...
        }
    }
    close(fd);
}


void taskII()
{
    _threadRunning = false;
    _taskI.join();
}