int flags = fcntl(fd, F_GETFL, 0); flags |= O_NONBLOCK; fcntl(fd, F_SETFL, flags); close(fd); return 0; } ``` 在上面的代码中,我们首先通过open系统调用打开了一个文件,并获取了对应的文件描述符fd。然后使用fcntl系统调用中的F_GETFL操作来获取文件描述符当前的状态标志,并将其与O_NONBLOCK...
用命令F_GETFL和F_SETFL设置文件标志,比如阻塞与非阻塞 F_SETFL 设置给arg描述符状态标志,可以更改的几个标志是:O_APPEND, O_NONBLOCK,O_SYNC和O_ASYNC。 命令字(cmd)F_GETFL和F_SETFL的标志如下面的描述: O_NONBLOCK 非阻塞I/O;如果read(2)调用没有可读取的数据,或者如果write(2)操作将阻塞,read或write...
1. 复制一个现有的描述符(cmd=F_DUPFD). 2. 获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD). 3. 获得/设置文件状态标记(cmd=F_GETFL或F_SETFL). 4. 获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN). 5. 获得/设置记录锁(cmd=F_GETLK , F_SETLK或F_SETLKW). 1. cmd值的F_DUPFD : F_...
1、设置驱动程序的拥有者是本进程。使用fcntl(fd, F_SETOWN, getpid()); 其中fd是打开设备文件的文件描述符,通过getpid()函数获取本进程的PID。 2、文件默认标志是没有设置FASYNC标志位,需要设备该标志位,才能同步。首先获取默认配置flags =fcntl(fd, F_GETFL); 然后将FASYNC标志设置进去fcntl(fd, F_SETFL, f...
复制一个现有的描述符(cmd=F_DUPFD/F_DUPFD_CLOEXEC) 获得/设置文件描述符标记(cmd=F_GETFD/F_SETFD) 获得/设置文件状态标记(cmd=F_GETFL/F_SETFL) #常用 获得/设置异步I/O所有权(cmd=F_GETOWN/F_SETOWN) 获得/设置记录锁(cmd=F_GETLK/F_SETLK/F_SETLKW) #常用 ...
我们在前面所说的I/O模型都是阻塞I/O,即调用recv系统调用,如果没有数据则阻塞等待,当数据到来则将数据从内核空间(套接口缓冲区)拷贝到用户空间(recv函数提供的buf),然后recv返回,进行数据处理。 2、非阻塞I/O 我们可以使用 fcntl(fd, F_SETFL, flag | O_NONBLOCK); 将套接字标志变成非阻塞,调用recv,如果...
//对指定的fd设置非阻塞void SetNonBlock(int fd) {int fl = fcntl(fd, F_GETFL);if (fl < 0) {cerr << "fcntl error" << endl;exit(1);}fcntl(fd, F_SETFL, fl | O_NONBLOCK);} int main() {SetNonBlock(0);while (1) {char buf...
1 fcntl(STDIN_FILENO, F_SETOWN, getpid()); //设置本进程为STDIN_FILENO文件的拥有者,没有这一步,内核不会知道应该将信号发给哪个进程 2 oflags = fcntl(STDIN_FILENO, F_GETFL); //获取设备文件的f_flags 3 fcntl(STDIN_FILENO, F_SETFL, oflags | FASYNC); //为了启用异步通知机制,还需对设备设置...
F_SETFL:将文件状态标志设置为第三个参数的值 F_GETOWN:获取当前SIGIO和SIGURG信号的进程ID和组ID F_SETOWN:设置接收SIGIO和SIGURG信号的进程ID和组ID 第三参数:总是一个整数,一般0 返回值:出错:-1 成功:其他 ioctl 函数 ioctl函数是I/O操作的万金油,内核对设备的IO通道控制操作函数,多用于驱动程序。
通过fcntl() 的 F_SETFL 操作来完成: flags = fcntl(fd, F_GETFL); fcntl(fd, F_SETFL, flags | O_ASYNC); 5> 进程等待 "IO 就绪" 信号的到来。 当I/O 操作就绪时,内核会给进程发送一个信号,然后调用在第 1 步中安装好的信号处理函数。