文件非阻塞状态打开后改变为阻塞状态
2012-05-10 12:37
381 查看
fcntl函数中F_SETFL 设置文件描述词状态旗标,参数arg为新旗标,但只允许O_APPEND、O_NONBLOCK和O_ASYNC位的改变,其他位的改变将不受影响。
所以如果打开文件时是用非阻塞状态打开的:
open("/dev/tty",O_RDWR|O_NOCTTY|O_NDELAY);
则可以用fcntl改变文件状态标志:fcntl(fd, F_SETFL, 0);--改变文件为阻塞状态。
或者麻烦点,但易于理解:
1、获取文件的flags,即open函数的第二个参数:
flags = fcntl(fd,F_GETFL,0);
2、设置文件的flags:
fcntl(fd,F_SETFL,flags);
3、增加文件的某个flags,比如文件是阻塞的,想设置成非阻塞:
flags = fcntl(fd,F_GETFL,0);
flags |= O_NONBLOCK;
fcntl(fd,F_SETFL,flags);
4、取消文件的某个flags,比如文件是非阻塞的,想设置成为阻塞:
flags = fcntl(fd,F_GETFL,0);
flags &= ~O_NONBLOCK;
fcntl(fd,F_SETFL,flags);
对普通文件的读写不存在阻塞问题,对和终端、网络连接等对应的文件描述符才会阻塞
所以如果打开文件时是用非阻塞状态打开的:
open("/dev/tty",O_RDWR|O_NOCTTY|O_NDELAY);
则可以用fcntl改变文件状态标志:fcntl(fd, F_SETFL, 0);--改变文件为阻塞状态。
或者麻烦点,但易于理解:
1、获取文件的flags,即open函数的第二个参数:
flags = fcntl(fd,F_GETFL,0);
2、设置文件的flags:
fcntl(fd,F_SETFL,flags);
3、增加文件的某个flags,比如文件是阻塞的,想设置成非阻塞:
flags = fcntl(fd,F_GETFL,0);
flags |= O_NONBLOCK;
fcntl(fd,F_SETFL,flags);
4、取消文件的某个flags,比如文件是非阻塞的,想设置成为阻塞:
flags = fcntl(fd,F_GETFL,0);
flags &= ~O_NONBLOCK;
fcntl(fd,F_SETFL,flags);
对普通文件的读写不存在阻塞问题,对和终端、网络连接等对应的文件描述符才会阻塞
相关文章推荐
- vim设置为indent折叠以后,每次打开文件时代码处于折叠状态,能改变吗?
- vb.net or vb判断文件是否执行中(打开状态)
- 关于执行命令:sudo apt-get update后的“E: 无法解析或打开软件包的列表或是状态文件”问题解决
- ubuntu12.04软件中心打开错误和 ubuntu 包管理之“:E: 读错误 - read (5: 输入/输出错误) E: 无法解析或打开软件包的列表或是状态文件。”的解决
- Ubuntu“无法解析或打开软件包的列表或是状态文件”的解决办法。
- 在打开CAD文件的时候会出现死机的状态
- ubuntu12.04软件中心打开错误和 ubuntu 包管理之“:E: 读错误 - read (5: 输入/输出错误) E: 无法解析或打开软件包的列表或是状态文件。”的解决
- AE二次开发中,打开本地shp文件后,出现文件锁定状态,即后缀为 .sr.lock
- Emacs上的自动保存和打开文件状态
- System.IO.FileSystemWatcher与文件的打开状态
- 无法解析或打开软件包的列表或是状态文件 解决方案 (部分转)
- ubuntu12.04软件中心打开错误和 ubuntu 包管理之“:E: 读错误 - read (5: 输入/输出错误) E: 无法解析或打开软件包的列表或是状态文件。”的解决
- [转帖]调用explore打开指定文件所在的文件夹,并把目标文件设为选定状态,甚至.lnk文件也能自动找到它的目标执行程序文件。
- 通过修改注册表改变txt文件的默认打开方式
- 无法打开物理文件 。操作系统错误 5:"5(拒绝访问。)"。 消息 5120,级别 16,状态 101,
- linux 查看进程“打开”的文件或文件对应的进程及网络状态
- ubuntu无法解析或打开软件包的列表或是状态文件 解决方法
- 打开目录,读取目录 ,然后获得文件状态
- Ubuntu“无法解析或打开软件包的列表或是状态文件”的解决办法。
- /cn.archive.ubuntu.com_ubuntu_dists_quantal_multiverse_i18n_Translation-zh E: 无法解析或打开软件包的列表或是状态文件。