在编程中,阻塞是指当一个操作无法立即完成时,程序会暂停执行,直到操作完成为止。而非阻塞模式则允许程序继续执行,而不必等待操作完成。
一、setnonblocking 函数介绍
setnonblocking 函数会改变文件描述符属性, 将其设置为非阻塞状态。在非阻塞状态下,当某个操作无法立即完成时,该操作会立即返回一个错误码,而不会暂停程序的执行。以下为示例代码:
#include <fcntl.h>
void setnonblocking(int fd){
fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);
}
使用setnonblocking 函数需要注意的问题:
-
- 非阻塞模式下的操作返回错误码并不表示操作失败,只是表示该操作无法立即完成。
- 非阻塞模式下的程序需要使用适当的技术来处理未完成的操作。
二、fcntl 函数介绍
在以上代码段中还包含了另一个函数fcntl, fcntl 函数可以用来改变文件描述符的属性。
#include<unistd.h>
#include<fcntl.h>
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd ,struct flock* lock);
int fcntl(int fd, int cmd, ... /* arg */ );
参数介绍:
fd : 文件描述符
cmd : 设置的命令
常用的命令:
F_GETFL 取得文件描述符状态flags,此flags为open()的参数。
F_SETFL 设置文件描述符状态flags,参数arg为新flags,但只允许O_APPEND、O_NONBLOCK和O_ASYNC位的改变,其他位的改变将不受影响。
arg :可有可无
返回值:
文件状态标志, -1表示失败。