标签:
1、fcntl:manipulate file descriptor
1)简介:fcntl(file control)函数可执行各种描述符控制操作。
#include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ );
2)正确的使用方法(以设置“非阻塞”标记为例):
int flags; // 先获取当前的flags if ((flags = fcntl(sockfd, F_GETFL, 0)) < 0) // 错误处理... flags |= O_NONBLOCK; // 加上“非阻塞”flag if (fcntl(sockfd, F_SETFL, flags) < 0) // 设置新的flags // 错误处理...
3)常用用法:
(1)cmd为F_SETFL,flags“包含”O_NONBLOCK:把一个套接字设置为非阻塞型。
(2)cmd为F_SETFL,flags“包含”O_ASYNC:把一个套接字设置成一旦其状态发生变化,内核就产生一个SIGIO。
(3)cmd为F_SETOWN:指定用于接收SIGIO或SIGURG信号的套接字属主(进程ID或进程组ID)。SIGIO是套接字被设置为信号驱动式I/O型后产生的,而SIGURG是在新的带外数据到达套接字时产生的。
SIGIO与SIGURG与其他信号的不同之处在于,这两个信号仅在已使用F_SETOWN命令给相关套接字指派了属主后才会产生。F_SETOWN命令对应的arg参数是正整数时,指出接收信号的进程ID;为负整数时,其绝对值指出接收信号的进程组ID(此时整个进程组中的所有进程接收信号)。
(4)cmd为F_GETOWN:返回套接字的当前属主。
4)示例:
int main(int argc, char *argv[]) { if (argc != 2) { printf("usage: a.out <fd>\n"); exit(1); } int val = 0; if ((val = fcntl(atoi(argv[1]), F_GETFL)) < 0) { printf("fcntl error for fd %d\n", atoi(argv[1])); exit(1); } switch(val & O_ACCMODE) { case O_RDONLY: printf("read only"); break; case O_WRONLY: printf("write only"); break; case O_RDWR: printf("read write"); break; default: printf("invalid access mode\n"); exit(1); } if (val & O_APPEND) printf(", append"); if (val & O_NONBLOCK) printf(", nonblocking"); printf("\n"); return 0; }
编译成a.out,运行:
[root@localhost ~]# ./a.out 0 < /dev/tty # 将标准输入(fd为0)重定向到/dev/tty read only [root@localhost ~]# ./a.out 2 2>>temp.foo # 将标准出错重定向到temp.foo,且使用追加写模式 write only, append [root@localhost ~]# ./a.out 5 5<>temp.foo # 在文件描述符5上以可读可写模式打开temp.foo read write
参考资料:
《UNIX网络编程 卷1:套接字联网API》
《UNIX环境高级编程》
不断学习中。。。
标签:
原文地址:http://www.cnblogs.com/hanerfan/p/5785806.html