码迷,mamicode.com
首页 > 其他好文 > 详细

fcntl函数介绍

时间:2016-08-19 00:37:00      阅读:353      评论:0      收藏:0      [点我收藏+]

标签:

  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环境高级编程》

 

 

 

不断学习中。。。

fcntl函数介绍

标签:

原文地址:http://www.cnblogs.com/hanerfan/p/5785806.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!