linux c编程之fcntl
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相关推荐
- linux C编程之makefile
linux C编程之makefile 目的: 基本掌握了 make 的用法,能在Linux系统上编程. 环境: Linux系统,或者有一台Linux服务器,通过终端连接.一句话 ...
- Linux网络编程之IP地址转换为无符号整数的方法
Linux网络编程之IP地址转换为无符号整数的方法,代码如下:(没考虑异常输入) #include <stdio.h> #include <string.h> #include ...
- Linux网络编程之sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
Linux网络编程之sockaddr与sockaddr_in,sockaddr_un结构体详细讲解 (1)sockaddr struct sockaddr { unsigned short sa_ ...
- linux读取文件修改时间函数,Linux服务器编程之utime()函数修改文件存取时间
Linux服务器编程之utime()函数修改文件存取时间 C语言utime()函数:修改文件的存取时间和更改时间 头文件: #include #include 定义函数: int utime(cons ...
- Linux网络编程之TCP状态转移
Linux网络编程之TCP状态转移 一.TCP状态转移时序 二.半关闭及shutdown函数 一.TCP状态转移时序 TCP状态转移图: netstat -apn | grep client 查看客户 ...
- 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 ...
- linux嵌入式c网络编程,嵌入式Linux网络编程之:网络高级编程
本文引用地址:http://www.eepw.com.cn/article/257115.htm 在实际情况中,人们往往遇到多个客户端连接服务器端的情况.由于之前介绍的如connet().recv() ...
- linux如何实现网络高级编程,嵌入式Linux网络编程之:网络高级编程-嵌入式系统-与非网...
10.3 网络高级编程 在实际情况中,人们往往遇到多个客户端连接服务器端的情况.由于之前介绍的如connet().recv()和send()等都是阻塞性函数,如果资源没有准备好,则调用该函数的进程将 ...
- Linux应用编程之dup函数和dup2函数
在 Linux 系统中,open 返回得到的文件描述符 fd 可以进行复制,复制成功之后可以得到一个新文件描述符,使用新的文件描述符和旧的文件描述符都可以对文件进行 IO 操作,复制得到的文件描述符和 ...
最新文章
- 蓝桥杯_算法训练_大小写转换
- c++ 获取文件的hashcode_jsp 实现文件上传和下载
- (转)Three challenges you’re going to face when building a chatbot
- mysql在linux下显示花_在Linux 中搭建 Mysql
- android arp工具,GitHub - SummerSnow274/ARP_sed_rev: 在Android通过ARP询问实现获取同一网络所有设备的MAC地址,AP隔离的网络除外...
- 自动驾驶芯片_盘点全球自动驾驶芯片“战场”参与者
- Xtrabackup远程备份+限速
- 谷歌发布Edge TPU芯片,云上模型本地运行丨附尝鲜地址
- 【PHP大马】定义、下载、使用、源码
- docker迁移禅道
- 二手车之家业务缓存应用实战
- C#绘制中国象棋棋盘
- PI3激酶生物学研究丨PI3激酶活性检测试剂盒方案
- 【雷达与对抗】【2013.12】一种紧凑型超宽带雷达系统
- c语言如何编辑一个长方形,C语言对象编程第一弹封装与抽象(建立长方形对象)...
- 鹏哥手把手带我刷好题 · 编程练习 · II
- java 解析word模板为xml, 动态填充数据到xml,最后输出word文档
- 解决VS2017/2019无法在线升级
- MySql数据结构、索引优化原则(Java劝退师)
- 使用PyG (PyTorch Geometric) 实现同质图transductive链路预测任务