2015-05-29 58 views
1

我想做一個非阻塞閱讀,但函數永遠不會返回。有人能提出一些建議嗎這是我設置非阻塞fd的代碼。非阻塞閱讀永不返回

from_ap = open(FFS_GBEMU_OUT, O_RDWR|O_NONBLOCK); 
if (from_ap < 0) 
    return from_ap; 

我也試圖與類似的結果

from_ap = open(FFS_GBEMU_OUT, O_RDWR); 
int status = fcntl(from_ap, F_SETFL, fcntl(from_ap, F_GETFL, 0) | O_NONBLOCK); 

if (status == -1){ 
perror("calling fcntl"); 

這裏是我打電話給我讀功能:

rsize = read(from_ap, cport_rbuf, ES1_MSG_SIZE); 
if (rsize < 0) { 
    printf("error %zd receiving from AP\n", rsize); 
    return NULL; 
} 

我也有類似的結果試過這樣:

fd_set readset; 
struct timeval tv; 
FD_ZERO(&readset); 
FD_SET(from_ap, &readset); 
tv.tv_sec = 0; 
tv.tv_usec = 100; 

result = select(from_ap+1, &readset, NULL, NULL, &tv); 

if (result > 0 && FD_ISSET(from_ap, &readset)){ 
    printf("there was something to read\n"); 
    rsize=read(from_ap,cport_rbuf,ES1_MSG_SIZE); 
} 

最後一個mes收到的聖人是「有東西要讀」,代碼不會進一步發展。我做錯了什麼?這不是一個多線程的程序,所以沒有人可以改變標誌,但我反正在閱讀之前打印回標誌來確認它們。

+1

什麼都沒有引起我的注意。你能創建一個展示問題的[最小化,完整和可驗證的示例程序](/ help/mcve)嗎? –

+0

@JohnKugelman按照你的說法寫了一個文件,它沒有問題,但這個不起作用。 –

+0

爲什麼你在select(from_ap + 1)中加1 from_ap? – Les

回答

1

設備是否支持O_NONBLOCK?這似乎是來自GitHub的代碼gbsim。閱讀gbsim,完全有可能驅動程序不支持非阻塞呼叫。

+0

是的代碼是從gbsim。我正在使用DUMMY_HCD從小工具循環回來我一定會考慮這個 –

+0

我已經嘗試過雖然使用select只讀數據可用時使用阻塞讀取希望代碼不會陷入塊;仍然卡住任何建議在那 –

+0

如果一個設備不支持非阻塞I/O,那麼它也不太可能支持'select'。他們差不多是一回事。 –