3.1.13.fcntl函数介绍 读: f啃处
3.1.13.1、fcntl的原型和作用
(1)fcntl函数是一个多功能文件管理的工具箱,接收2个参数+1个变参。第一个参数是fd表示要操作哪个文件,第二个参数是cmd表示要进行哪个命令操作。变参是用来传递参数的要配合cmd来使用。

看看 cmd 命令

(2)cmd的样子类似于F_XXX,不同的cmd具有不同的功能。学习时没必要去把所有的cmd的含义都弄清楚(也记不住),只需要弄明白一个作为案例,搞清楚它怎么看怎么用就行了,其他的是类似的。其他的当我们在使用中碰到了一个fcntl的不认识的cmd时再去查man手册即可。

3.1.13.2、fcntl的常用cmd
(1)F_DUPFD这个cmd的作用是复制文件描述符(作用类似于dup和dup2),这个命令的功能是从可用的fd数字列表中找一个比arg(可变参数)大或者和arg(可变参数)一样大的数字作为oldfd的一个复制的fd,和dup2有点像但是不同。

dup2返回的就是我们指定的那个newfd ,否则就会出错;

但是F_DUPFD命令返回的是>=arg(可变参数)的最小的那一个数字。

实例:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>#define FILENME   "1.txt"
/*
O_RDWR : 可读可写
O_TRUNC : 会把原有内容删除  。 英文读:欧擦克
O_CREAT  : 如果a.txt 没有这个文件,就会新建一个 a.txt
O_APPEND  : 接续添加要写入的内容 。 英文读:欧额盆得
*/int main(void)
{int fd1 = -1, fd2 = -1;int ret = -1;  /*ret 用来存放读取 read 文件函数的返回值: 0代表读 完了;ret >1(ret大于1)代表成功; -1代表失败*/fd1 = open(FILENME, O_RDWR ); if(fd1<0)/* 小于0, 打开失败 */{perror("open");return -1;}printf("fd1 = %d.\n", fd1);// fd2 文件描述符会等于或大于 >= 6 的一个文件描述符fd2 = fcntl(fd1, F_DUPFD , 6);printf("fd2 = %d .\n",fd2);while(1){//写文件,fd1ret = write(fd1, "ab", 2);if(ret < 0){printf("wirte失败\n");_exit(-1);}else{printf("wirte成功 fd1写入%d 字节 \n", ret);}//写文件,fd2ret = write(fd2, "cd", 2);if (ret < 0){//printf("write失败.\n");perror("write失败");_exit(-1);}else{printf("write成功,fd2写入了%d个字符\n", ret);}sleep(1);/* 延时 1 秒 */}//因为只打开了 fd1, 所以只关闭fd1就可以了close(fd1);return 0;
}

运行结果

 如果我们 给 可变参数一个 0 , 返回是4, 因为 0 、1、 2、被标准输入输出给占用了

fd2 = fcntl(fd1, F_DUPFD , 0);

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>#define FILENME   "1.txt"
/*
O_RDWR : 可读可写
O_TRUNC : 会把原有内容删除  。 英文读:欧擦克
O_CREAT  : 如果a.txt 没有这个文件,就会新建一个 a.txt
O_APPEND  : 接续添加要写入的内容 。 英文读:欧额盆得
*/int main(void)
{int fd1 = -1, fd2 = -1;int ret = -1;  /*ret 用来存放读取 read 文件函数的返回值: 0代表读 完了;ret >1(ret大于1)代表成功; -1代表失败*/fd1 = open(FILENME, O_RDWR ); //加O_APPEND解决覆盖问题if(fd1<0)/* 小于0, 打开失败 */{perror("open");return -1;}printf("fd1 = %d.\n", fd1);// fd2 文件描述符会等于或大于 >= 0 的一个文件描述符fd2 = fcntl(fd1, F_DUPFD , 0);printf("fd2 = %d .\n",fd2);while(1){//写文件,fd1ret = write(fd1, "ab", 2);if(ret < 0){printf("wirte失败\n");_exit(-1);}else{printf("wirte成功 fd1写入%d 字节 \n", ret);}//写文件,fd2ret = write(fd2, "cd", 2);if (ret < 0){//printf("write失败.\n");perror("write失败");_exit(-1);}else{printf("write成功,fd2写入了%d个字符\n", ret);}sleep(1);/* 延时 1 秒 */}//因为只打开了 fd1, 所以只关闭fd1就可以了close(fd1);return 0;
}

运行结果

实例 :  关闭 标准输出 1:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>#define FILENME   "1.txt"
/*
O_RDWR : 可读可写
O_TRUNC : 会把原有内容删除  。 英文读:欧擦克
O_CREAT  : 如果a.txt 没有这个文件,就会新建一个 a.txt
O_APPEND  : 接续添加要写入的内容 。 英文读:欧额盆得
*/int main(void)
{int fd1 = -1, fd2 = -1;fd1 = open(FILENME, O_RDWR ); if(fd1<0)/* 小于0, 打开失败 */{perror("open");return -1;}printf("fd1 = %d.\n", fd1);//关闭标准输出 1 close(1);// fd2 文件描述符会等于或大于 >= 0 的一个文件描述符fd2 = fcntl(fd1, F_DUPFD , 0);printf("fd2 = %d .\n",fd2);printf("This is Text .\n");//因为只打开了 fd1, 所以只关闭fd1就可以了close(fd1);return 0;
}

运行结果:

3.1.13.fcntl函数介绍相关推荐

  1. (十一)fcntl函数的介绍和使用

    上一篇博客我们以read终端设备为例介绍了非阻塞I/O,为什么我们不直接对STDIN_FILENO做非阻塞read,而要重新open一遍/dev/tty呢?因为STDIN_FILENO在程序启动时已经 ...

  2. linux非阻塞输入函数,Linux fcntl函数设置阻塞与非阻塞

    转自http://www.cnblogs.com/xuyh/p/3273082.html 用命令F_GETFL和F_SETFL设置文件标志,比如阻塞与非阻塞 F_SETFL     设置给arg描述符 ...

  3. C++文件操作API函数介绍

    转自 http://www.studentblog.net/m/tonycat/archives/2006/26364.html 文件的基本概念 所谓"文件"是指一组相关数据的有序 ...

  4. python3 转码的函数_python基础3之文件操作、字符编码解码、函数介绍

    内容概要: 一.文件操作 二.字符编码解码 三.函数介绍 一.文件操作 文件操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 基本操作: 1 #/usr/bin/e ...

  5. 使用 fcntl 函数 获取,设置文件的状态标志

    前言 当打开一个文件的时候,我们需要指定打开文件的模式( 只读,只写等 ).那么在程序中如何获取,修改这个文件的状态标志呢?本文将告诉你如何用 fcntl函数 获取指定文件的状态标志. 解决思路 1. ...

  6. 文件控制 fcntl函数具体解释

    摘要:本文主要讨论文件控制fcntl函数的基本应用.dup函数能够拷贝文件描写叙述符,而fcntl函数与dup函数有着异曲同工之妙.而且还有更加强大的功能,能够获取或设置已打开文件的性质,操作文件锁. ...

  7. Python-EEG工具库MNE中文教程(13)-“bad“通道介绍

    目录 标记坏频道/标记不良通道(marking bad channels) 本分享为脑机学习者Rose整理发表于公众号:脑机接口社区 .QQ交流群:903290195 本教程主要介绍手动标记坏通道以及 ...

  8. python文件操作解码_python基础3之文件操作、字符编码解码、函数介绍

    内容概要: 一.文件操作 二.字符编码解码 三.函数介绍 一.文件操作 文件操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 基本操作: 1 #/usr/bin/e ...

  9. 1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client

     1  Socket编程 socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP 地址+端 ...

最新文章

  1. BZOJ4401 块的计数
  2. 操作选项_消防设施操作员关键技能之六:能切换集中火灾报警控制器、消防联动控制器工作状态...
  3. 自定义曲线_完美动力小课堂:AnimationCurve(动画曲线编辑) 如何使用?
  4. IOS开发基础之socket的使用
  5. jQuery事件整合
  6. 安卓apk签名提取工具_Android测试工具入门介绍(二)
  7. mysql 主从 仅备份从库_MySQL主从复制 - 从数据库备份数据库
  8. socket,与粘包
  9. 三星note3 android4.3,三星N9002 (Note3联通双卡版 Android4.3)一键救砖教程,轻松刷回官方系统...
  10. bzoj 4247: 挂饰(DP)
  11. DevOps:让开发和运维告别“相爱相杀”
  12. 写函数,输入n个数字输出最大值和最小值
  13. WebLogic的安装步骤及部署
  14. 后端返回图片二进制流,前端处理
  15. react富文本编辑器
  16. 2017校园招聘 携程编程题
  17. PDF文本的提取(Linux)
  18. 一个mybatis动态 SQL查询的完整小案例。包含多表联合查询。
  19. Django静态文件的管理
  20. Python数据分析之武林秘籍

热门文章

  1. 剑指Offer(29)顺时针打印矩阵
  2. installous下载ipa目录
  3. wpf中textblock竖立显示文本
  4. 【22考研】计算机/软件等专业调剂信息集合!【完结版】
  5. 【转】KCP快速可靠协议
  6. 2020春软件构造Lab2 ADT and OOP
  7. python学什么方向就业好_学习python就业方向都有哪些?
  8. 安卓期末大作业——购物商城(源码+18页报告)
  9. storm是java还是python_Storm与Spark、Hadoop相比是否有优势
  10. cma可以免考几门acca