0

任务 I中:

...

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

任务二中:

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

在任务 II中应该做什么来取消被阻止的任务 I

vxworks中,有一个功能,ioctl(fd, FIOCANCEL, 0)可以取消阻止的读取或写入,但它不能工作。可能是因为驱动程序不支持“FIOCANCEL”

如何在 vxworks 和 linux 中编写任务 II?还是有其他方法可以完成我的任务?

4

2 回答 2

0

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

对 linux 和 vxworks 使用相同的代码是不可能做到这一点的。

于 2016-04-25T23:59:15.657 回答
-2

不要使用阻塞 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();
}
于 2013-07-27T14:13:06.557 回答