[英]How can I cancel a blocked read/recvfrom system call on vxworks or linux
在任務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中應該怎么做才能取消被阻止的任務I ,
在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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.