2013-07-22 75 views
0

的任務,我如何取消VxWorks的阻塞讀/ recvfrom的系統調用或Linux

... 

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?還是有任何其他方式來完成我的任務?

+0

接收信號將導致讀取返回-1並且錯誤EINTR – LostBoy

+0

意味着任務I「接收信號」?我阻止的任務?它怎麼稱呼接收信號功能? –

+0

鑑於您使用Linux並且您知道任務1的進程ID,您可以通過在任務2中調用kill(pid,SIGUSR1)向其發送信號。這會使讀取以-1返回。 Errno將被設置爲EINTR。 – LostBoy

回答

-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(); 
} 
0

取消讀/ recvfrom的通話是在Linux上不可能。您無法使用相同的API編寫這些任務。在Linux上,您可以使用epoll和O_NONBLOCK來創建取消讀取/ recvfrom的語義。

它是不可能使用相同的代碼爲linux和vxworks做到這一點。