2008年6月5日 星期四

read function 設定Non-Blocking I/O的方式

利用 fcntl 或是 ioctl 來設定 Non-Blocking I/O,讓 read function 不會被 Block住:


#include <fcntl.h> //fcntl的header
#include <sys/ioctl.h> //ioctl的header
...

int flag;
//用fcntl設定Non-Blocking I/O
fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);
//用ioctl設定Non-Blocking I/O
ioctl(STDIN_FILENO, FIONBIO, &flag);


fcntl的完整用法是先用F_GETFL取得flags,在把flags和要改變的flag進行&、|,最後在用F_SETFL把flags設定回去。

int flags;

//取得flags
if ((flags = fcntl(fd, F_GETFL, 0)) == -1)
{
//進行錯誤處理
}

//加入non-blocking I/O的flag
flags |= O_NONBLOCK;

//設定flags
if ((flags = fcntl(fd, F_SETFL, flags)) == -1)
{
//進行錯誤處理
}


參考資料 :
Advanced Programming in the Unix Environment

沒有留言: