簡體   English   中英

如何在vxworks或linux上取消被阻止的read / recvfrom系統調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM