fcntl函数提供了对文件描述符的各种控制操作。另外一个常见的控制文件描述符属性和行为的系统调用是ioctl,而且ioctl比fcntl能够执行更多的控制。但是对于控制文件描述符常用的属性和行为,fcntl函数是由POSIX规范指定的首选方法,函数定义如下:

#include<fcntl.h>
int fcntl(int fd,int cmd,...)

fd参数是被操作的文件描述符,cmd参数指定执行何种类型的操作。根据操作类型的不同,该函数可能还需要第三个可选参数arg。fcntl函数支持的常用操作及其参数如下表所示:

fcntl函数成功时返回值如表所示,失败则返回-1并设置errno。

在网络编程中,fcntl函数通常用来将一个文件描述符设置为非阻塞的,示例代码如下:

此外,SIGIO和SIGURG这两个信号与其他linux信号不同,它们必须与某个文件描述符相关联方可使用:当被关联的文件描述符可读或可写的时候,系统将出发SIGIO信号;当被关联的文件描述符(而且必须是一个socket)上有带外数据可读的时候,系统将触发SIGURG信号。将信号和文件描述符关联的方法就是使用fcntl函数为目标文件描述符指定宿主进程或进程组,那么被指定的宿主进程或进程组将捕获这两个信号。使用SIGIO时,还需要利用fcntl设置O_ASYNC标志(异步IO标志,不过SIGIO信号模型并非真正意义上的异步IO模型)。

mmap函数用于申请一段内存空间。我们可以将这段内存作为进程间通信的共享内存,也可以将文件直接映射其中。munmap函数则释放有mmap创建的这段内存空间,它们的定义如下:

#include<sys/mman.h>
void* mmap(void*start,size_t length,int prot ,int flags, int fd,off_t offset);
int munmap(void* start size_t length);

start参数允许用户使用某个特定的地址作为这段内存的起始位置。如果它被设置为NULL,则系统自动分配一个地址。

length参数指定内存段的长度。

proto参数用来设置内存段的访问权限,它可以去以下几个值的按位与:

flags参数控制内存段内容被修改后程序的行为。它可以被设置为图6-1中的某些值(这里仅仅列出了常用的值)的按位或(其中MAP_SHARED和MAP_PRIVATE是互斥的,不能同时指定)

linux 高级IO函数之fcntl mmap/munmap相关推荐

  1. linux 高级IO函数之sendfile splice tee

    sendfile函数在两个文件描述符之间传递数据(完全在内核中操作),从而避免内核缓冲区和用户缓冲区之间的数据拷贝,效率很高,这被称为零拷贝.函数的定义如下: #include<sys/send ...

  2. 【Linux系统IO函数】lseek函数

    Linux系统IO函数-lseek函数 1.1 lseek函数与标准C库的fseek函数 lseek函数对应标准C库中的fseek函数 查看标准C库中的fseek函数使用说明: (shell输入) m ...

  3. 标准C库IO函数和Linux系统IO函数对比

    标准C库IO函数和Linux系统IO函数对比 man 3 fopen #查看函数详情 虚拟地址通过mmu映射到真是的地址空间

  4. 【Linux系统编程学习】Linux系统IO函数(open、read、write、lseek)

    此为牛客网Linux C++课程1.20课程笔记. 1.open函数 open函数有两种,分别是打开一个已经存在的文件和创建并打开一个不存在的文件. #include <sys/types.h& ...

  5. linux io函数,unix/Linux低级IO函数的用法有哪些? 爱问知识人

    内容包括: open() ,尤其是各种常见的参数,到底是什么意思, 比如常用创建一个空文件: fd = open("/tmp/xx.txt",O_RDWR | O_CREAT | ...

  6. Linux系统函数之IO函数

    技术交流 QQ 群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.标准C库IO函数工作流程 IO缓冲区的作用? 大部分硬盘都是机械硬盘,读取寻道时间 ...

  7. 【Linux系统编程学习】C库IO函数与系统IO函数的关系

    此为黑马Linux课程笔记. 1. C标准IO函数工作流程 如图,以C库函数的fopen为例,其返回类型是FILE类型的指针,FILE类型包含很多内容,主要包含三个内容:文件描述符.文件读写指针的位置 ...

  8. Linux高级应用(二)文件IO函数与液晶屏显示

    一.结构体占用的内存 struct test { char a; int b; short c; long d; char *p; }; 求该结构体占用的内存?sizeof(struct test) ...

  9. Linux之高级IO

    目录 一.五种IO模型 以网络为例 什么叫做IO? 什么叫做高效的IO呢? 为什么第二个大爷的效率很高呢? 五种IO模型 感性认识 这五个人,在钓鱼的时候,谁的效率是最高的? 阻塞IO 非阻塞IO 信 ...

最新文章

  1. 大一新生,你为何逃课?
  2. RabbitMQ之RPC实现
  3. mysql导入Excel数据
  4. 安装apache+gd2(jpeg,png等)+mysql-client+php脚本
  5. 反思快速完成功能代码
  6. java数据接口之链表_Java数据结构和算法之链表
  7. 拥有一台你的轻量应用服务器Lighthouse
  8. 硒测试中所需的功能和示例
  9. 温故而知新 C++ 类型转换
  10. Etherchannel 备忘
  11. 特征向量的线性无关性
  12. UIScrollView 遇到的小坑
  13. 腾讯联手联通推出车联网“网卡”,打“内容”+“流量”的组合拳
  14. 物联网小课堂之NB-IoT无线通信中的发射功率和接收灵敏度
  15. .NET Core之EF Core
  16. 查找表字段-事务码 AUT10
  17. 文曲星猜数字游戏java代码_文曲星猜数字游戏6步算法(含代码)
  18. 插座测试仪的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  19. 2014华为南研所实习生求职
  20. 网站服务器发生故障,全国DNS服务器发生故障

热门文章

  1. js json制表符报错_llhttp是如何使Node.js性能翻倍的?
  2. 导师推荐 | 第 4 期临床基因组家系分析,同时解决科研和临床问题
  3. rsync配置和使用
  4. kk6.0 服务器信息 端口,KK的服务器改了端口以后 为什么我进不去
  5. P1047 [NOIP2005 普及组] 校门外的树(python3实现)
  6. P2249 【深基13.例1】查找(AC) 2022.1.28
  7. php 获取子孙,jquery如何查找后代元素?jquery获取后代元素方法
  8. dos导入mysql数据库表_用DOS命令在Linux下mysql数据库的导入导出操作
  9. dedecms 系统迁移及问题
  10. Android笔记-Xposed的使用(Hook登录函数获取用户名密码)