关于fcntl()函数的cmd
来源:互联网 发布:php artisan clear 编辑:程序博客网 时间:2024/06/05 06:22
#include <fcntl.h>int fcntl(int filedes, int cmd, ... /* int arg */ );
Returns: depends on cmd if OK (see following), 1 on error
下午的时候遇到一个非常奇怪的问题,就是对一个文件描述符设置了非阻塞方式但write()这个描述符的时候却还是会阻塞,于是感到非常郁闷。这个描述符是通过socket()建立的一个PF_UNIX套接字,由于对这种类型的套接字不是很熟悉,所以猜想是他不支持非阻塞方式,结果后来弄明白了,错误出在cmd上面了。
void set_fl(int fd, int flags) {
int val;
if ((val = fcntl(fd, F_GETFL, 0)) < 0)
err_sys("fcntl F_GETFL error");
val |= flags; /* turn on flags */
if (fcntl(fd, F_SETFL, val) < 0)
err_sys("fcntl F_SETFL error");
}
上面是教科书上的用法,错误也出在这里,错误地将F_SETFL换成了F_SETFD,下面我们来看看FD和FL的差别:
F_GETFD
Return the file descriptor flags for filedes as the value of the function.
F_SETFD
Set the file descriptor flags for filedes.
F_GETFL
Return the file status flags for filedes as the value of the function.
F_SETFL
Set the file status flags to the value of the third argument (taken as an integer).
当时我错误的理解修改文件描述符的非阻塞方式应该是修改file descriptor的flag,但是实际上需要修改的是file status的flag。
一个是file descriptor一个是file status,虽然到现在依然很别扭,但是事情已经发生了:(,我们可以这样理解file descriptor的flag指的是仅仅只是它本身的一些状态(实际上它只有一个标志可以修改),而file status的状态才是它是否阻塞,是否同步异步读写,是否可读可写等标志。对于FD_SETFL大家都比较熟悉了,那么对于FD_SETFD有什么用呢?设置他有什么效果呢?别着急,听我慢慢道来:
在很久很久以前,有一个....(靠,哪里来的西红柿~~)
就是设置这个文件描述符在程序里面有exec()类似操作的时候是否依然有效,很遗憾,本人还没有搞清楚具体如何做。
- 关于fcntl()函数的cmd
- 关于fcntl()函数的疑问
- 关于linux 下fcntl()函数的介绍
- fcntl函数的使用
- fcntl函数的使用
- fcntl函数的应用
- fcntl()函数的用法
- fcntl函数的使用
- 函数fcntl的用法
- 关于fcntl()的小提示
- fcntl函数的简单应用
- fcntl函数的简单应用
- fcntl函数的简单应用
- fcntl函数锁的功能
- fcntl函数的简单应用
- linux下的fcntl()函数
- fcntl函数的用法总结
- fcntl函数的使用详解
- 不谈技术,不谈工作
- Effective Java(02)创建和销毁对象
- linux下不用expect一行修改密码
- 通过证书方式实现ssh的无密码登陆
- Linux下通过修改网卡驱动的参数调整Intel网卡的性能
- 关于fcntl()函数的cmd
- 续fcntl()之F_SETFD,F_GETFD
- iptables的time模块下载(适用于linux 2.6.18.1内核)
- linux的线程是否受到了保护?
- C++咬文嚼字-'Functions'
- linux socket的bug??
- 使用openssl api进行加密解密
- c++“反射”?
- 一个适用于windows和linux的抓包程序