fcntl可实现对指定文件描述符的各种操作,其函数原型如下:

int fcntl(int fd, int cmd, ... /* arg */ );

其中,操作类型由cmd决定。cmd可取如下值:

  • F_DUPFD:复制文件描述符
  • F_DUPFD_CLOEXEC:复制文件描述符,新文件描述符被设置了close-on-exec
  • F_GETFD:读取文件描述标识
  • F_SETFD:设置文件描述标识
  • F_GETFL:读取文件状态标识
  • F_SETFL:设置文件状态标识
  • F_GETLK:如果已经被加锁,返回该锁的数据结构。如果没有被加锁,将l_type设置为F_UNLCK
  • F_SETLK:给文件加上进程锁
  • F_SETLKW:给文件加上进程锁,如果此文件之前已经被加了锁,则一直等待锁被释放。

  接下来看两段代码:

#include <fcntl.h>
#include <unistd.h>
#include <cstring>
#include <cstdio>
#include <cstdlib>#define ERR_EXIT(msg) \do \{ \perror(msg); \exit(-1); \} while(0)int main()
{int fd = open("test.dat", O_CREAT | O_RDWR | O_TRUNC, 0644);if (fd < 0)ERR_EXIT("open file failed");struct flock f;memset(&f, 0, sizeof(f));f.l_type = F_WRLCK;f.l_whence = SEEK_SET;f.l_start = 0;f.l_len = 0;if (fcntl(fd, F_SETLK, &f) < 0)ERR_EXIT("lock file failed");printf("press any key to unlock\n");getchar();f.l_type = F_UNLCK;if (fcntl(fd, F_SETLK, &f) < 0)ERR_EXIT("unlock file failed");return 0;
}

上述代码实现了加锁和解锁两个操作。

#include <unistd.h>
#include <fcntl.h>
#include <cstdio>
#include <cstdlib>
#include <cerrno>
#include <sys/types.h>
#include <sys/stat.h>#define ERR_EXIT(msg) \do \{ \perror(msg); \exit(-1); \} while(0)void set_flag(int fd, int flags);
void clr_flag(int fd, int flags);int main()
{char buf[1024];set_flag(0, O_NONBLOCK);int ret = read(0, buf, 1024);if (ret < 0)ERR_EXIT("read failed");return 0;
}void set_flag(int fd, int flags)
{int val = fcntl(fd, F_GETFL, 0); if (val < 0)ERR_EXIT("get flag failed");val |= flags;if (fcntl(fd, F_SETFL, val) < 0)ERR_EXIT("set flag failed");
}
void clr_flag(int fd, int flags)
{int val = fcntl(fd, F_GETFL, 0);if (val < 0)ERR_EXIT("get flag failed");val &= ~flags;if (fcntl(fd, F_SETFL, val) < 0)ERR_EXIT("set flag failed");
}

其中set_flag设置文件状态标识,clr_flag清除文件状态标识。main函数中将stdout设置成非阻塞,所以执行read时,不等待用户输入而直接返回错误。

linux c编程之fcntl

转载于:https://www.cnblogs.com/guxuanqing/p/10570717.html

linux c编程之fcntl相关推荐

  1. linux C编程之makefile

    linux C编程之makefile 目的:       基本掌握了 make 的用法,能在Linux系统上编程. 环境:       Linux系统,或者有一台Linux服务器,通过终端连接.一句话 ...

  2. Linux网络编程之IP地址转换为无符号整数的方法

    Linux网络编程之IP地址转换为无符号整数的方法,代码如下:(没考虑异常输入) #include <stdio.h> #include <string.h> #include ...

  3. Linux网络编程之sockaddr与sockaddr_in,sockaddr_un结构体详细讲解

    Linux网络编程之sockaddr与sockaddr_in,sockaddr_un结构体详细讲解 (1)sockaddr struct sockaddr { unsigned  short  sa_ ...

  4. linux读取文件修改时间函数,Linux服务器编程之utime()函数修改文件存取时间

    Linux服务器编程之utime()函数修改文件存取时间 C语言utime()函数:修改文件的存取时间和更改时间 头文件: #include #include 定义函数: int utime(cons ...

  5. Linux网络编程之TCP状态转移

    Linux网络编程之TCP状态转移 一.TCP状态转移时序 二.半关闭及shutdown函数 一.TCP状态转移时序 TCP状态转移图: netstat -apn | grep client 查看客户 ...

  6. linux网络编程之socket(十一):套接字I/O超时设置方法和用select实现超时

    一.使用alarm 函数设置超时 C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13   void handler( int sig) { } signal(SIGALRM ...

  7. linux嵌入式c网络编程,嵌入式Linux网络编程之:网络高级编程

    本文引用地址:http://www.eepw.com.cn/article/257115.htm 在实际情况中,人们往往遇到多个客户端连接服务器端的情况.由于之前介绍的如connet().recv() ...

  8. linux如何实现网络高级编程,嵌入式Linux网络编程之:网络高级编程-嵌入式系统-与非网...

    10.3  网络高级编程 在实际情况中,人们往往遇到多个客户端连接服务器端的情况.由于之前介绍的如connet().recv()和send()等都是阻塞性函数,如果资源没有准备好,则调用该函数的进程将 ...

  9. Linux应用编程之dup函数和dup2函数

    在 Linux 系统中,open 返回得到的文件描述符 fd 可以进行复制,复制成功之后可以得到一个新文件描述符,使用新的文件描述符和旧的文件描述符都可以对文件进行 IO 操作,复制得到的文件描述符和 ...

最新文章

  1. 蓝桥杯_算法训练_大小写转换
  2. c++ 获取文件的hashcode_jsp 实现文件上传和下载
  3. (转)Three challenges you’re going to face when building a chatbot
  4. mysql在linux下显示花_在Linux 中搭建 Mysql
  5. android arp工具,GitHub - SummerSnow274/ARP_sed_rev: 在Android通过ARP询问实现获取同一网络所有设备的MAC地址,AP隔离的网络除外...
  6. 自动驾驶芯片_盘点全球自动驾驶芯片“战场”参与者
  7. Xtrabackup远程备份+限速
  8. 谷歌发布Edge TPU芯片,云上模型本地运行丨附尝鲜地址
  9. 【PHP大马】定义、下载、使用、源码
  10. docker迁移禅道
  11. 二手车之家业务缓存应用实战
  12. C#绘制中国象棋棋盘
  13. PI3激酶生物学研究丨PI3激酶活性检测试剂盒方案
  14. 【雷达与对抗】【2013.12】一种紧凑型超宽带雷达系统
  15. c语言如何编辑一个长方形,C语言对象编程第一弹封装与抽象(建立长方形对象)...
  16. 鹏哥手把手带我刷好题 · 编程练习 · II
  17. java 解析word模板为xml, 动态填充数据到xml,最后输出word文档
  18. 解决VS2017/2019无法在线升级
  19. MySql数据结构、索引优化原则(Java劝退师)
  20. 使用PyG (PyTorch Geometric) 实现同质图transductive链路预测任务

热门文章

  1. Java终止当前线程的方法
  2. Kali Linux Web***测试之 WebSploit
  3. C#中DateTime.Now.Ticks的用法和说明
  4. 查询XML节点 value
  5. 关于C#中的DLLImport (引)
  6. linux虚拟机下安装Tomcat
  7. 学java培训开发需要多少钱
  8. Java培训都学什么
  9. Java assert关键字
  10. 框架页面jquery装载