在 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?或者还有其他办法来完成我的任务吗?
答案 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();
}