在任务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? 或者还有其他办法来完成我的任务吗?
在linux上取消read / recvfrom调用是不可能的 。 您无法使用相同的API编写这些任务。 在Linux上,您可以使用epoll和O_NONBLOCK来创建取消read / recvfrom的语义。
对于linux和vxworks,使用相同的代码是不可能的 。
不要使用阻塞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(); }
以上就是c/c++开发分享如何在vxworks或linux上取消阻止的read / recvfrom系统调用相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/549301.html