我想做一個非阻塞閱讀,但函數永遠不會返回。有人能提出一些建議嗎這是我設置非阻塞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收到的聖人是「有東西要讀」,代碼不會進一步發展。我做錯了什麼?這不是一個多線程的程序,所以沒有人可以改變標誌,但我反正在閱讀之前打印回標誌來確認它們。
什麼都沒有引起我的注意。你能創建一個展示問題的[最小化,完整和可驗證的示例程序](/ help/mcve)嗎? –
@JohnKugelman按照你的說法寫了一個文件,它沒有問題,但這個不起作用。 –
爲什麼你在select(from_ap + 1)中加1 from_ap? – Les