Linux的c编程-文件节点的打开与读写操作

2023-11-09

1、open(打开文件)

相关函数
read,write,fcntl,close,link,stat,umask,unlink,fopen
表头文件
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
定义函数
int open( const char * pathname, int flags);
int open( const char * pathname,int flags, mode_t mode);

函数说明
参数pathname 指向欲打开的文件路径字符串。下列是参数flags 所能使用的旗标:
O_RDONLY 以只读方式打开文件
O_WRONLY 以只写方式打开文件
O_RDWR 以可读写方式打开文件。上述三种旗标是互斥的,也就是不可同时使用,但可与下列的旗标利用OR(|)运算符组合。
O_CREAT 若欲打开的文件不存在则自动建立该文件。
O_EXCL 如果O_CREAT 也被设置,此指令会去检查文件是否存在。文件若不存在则建立该文件,否则将导致打开文件错误。此外,若O_CREAT与O_EXCL同时设置,并且欲打开的文件为符号连接,则会打开文件失败。
O_NOCTTY 如果欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机。
O_TRUNC 若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0,而原来存于该文件的资料也会消失。
O_APPEND 当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。
O_NONBLOCK 以不可阻断的方式打开文件,也就是无论有无数据读取或等待,都会立即返回进程之中。
O_NDELAY 同O_NONBLOCK。
O_SYNC 以同步的方式打开文件。
O_NOFOLLOW 如果参数pathname 所指的文件为一符号连接,则会令打开文件失败。
O_DIRECTORY 如果参数pathname 所指的文件并非为一目录,则会令打开文件失败。
此为Linux2.2以后特有的旗标,以避免一些系统安全问题。参数mode 则有下列数种组合,只有在建立新文件时才会生效,此外真正建文件时的权限会受到umask值所影响,因此该文件权限应该为(mode-umaks)。
S_IRWXU00700 权限,代表该文件所有者具有可读、可写及可执行的权限。
S_IRUSR 或S_IREAD,00400权限,代表该文件所有者具有可读取的权限。
S_IWUSR 或S_IWRITE,00200 权限,代表该文件所有者具有可写入的权限。
S_IXUSR 或S_IEXEC,00100 权限,代表该文件所有者具有可执行的权限。
S_IRWXG 00070权限,代表该文件用户组具有可读、可写及可执行的权限。
S_IRGRP 00040 权限,代表该文件用户组具有可读的权限。
S_IWGRP 00020权限,代表该文件用户组具有可写入的权限。
S_IXGRP 00010 权限,代表该文件用户组具有可执行的权限。
S_IRWXO 00007权限,代表其他用户具有可读、可写及可执行的权限。
S_IROTH 00004 权限,代表其他用户具有可读的权限
S_IWOTH 00002权限,代表其他用户具有可写入的权限。
S_IXOTH 00001 权限,代表其他用户具有可执行的权限。
返回值
若所有欲核查的权限都通过了检查则返回0 值,表示成功,只要有一个权限被禁止则返回-1。
错误代码
EEXIST 参数pathname 所指的文件已存在,却使用了O_CREAT和O_EXCL旗标。
EACCESS 参数pathname所指的文件不符合所要求测试的权限。
EROFS 欲测试写入权限的文件存在于只读文件系统内。
EFAULT 参数pathname指针超出可存取内存空间。
EINVAL 参数mode 不正确。
ENAMETOOLONG 参数pathname太长。
ENOTDIR 参数pathname不是目录。
ENOMEM 核心内存不足。
ELOOP 参数pathname有过多符号连接问题。
EIO I/O 存取错误。
附加说明
使用access()作用户认证方面的判断要特别小心,例如在access()后再作open()空文件可能会造成系统安全上的问题。

举例说明:

#include <stdio.h>
#include <linux/input.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


#define DEVNAME "./sys/devices/bat_adc.14/gpio_buz_pwm"

main()
{
	int fd
	if ((fd = open(DEVNAME, O_RDWR | O_NONBLOCK)) != -1) {
		LOGD("open buz beep dev success fd[%d]\n", fd);
	} else {
		LOGD("open buz beep dev fail: fd[%d]\n", fd);
	}
}

2、read(从打开的文件读取数据)

相关函数
readdir,write,fcntl,close,lseek,readlink,fread
表头文件
#include<unistd.h>
定义函数
ssize_t read(int fd,void * buf ,size_t count);

函数说明
read()会把参数fd 所指的文件传送count个字节到buf指针所指的内存中。若参数count为0,则read()不会有作用并返回0。返回值为实际读取到的字节数,如果返回0,表示已到达文件尾或是无可读取的数据,此外文件读写位置会随读取到的字节移动。
附加说明
如果顺利read()会返回实际读到的字节数,最好能将返回值与参数count 作比较,若返回的字节数比要求读取的字节数少,则有可能读到了文件尾、从管道(pipe)或终端机读取,或者是read()被信号中断了读取动作。当有错误发生时则返回-1,错误代码存入errno中,而文件读写位置则无法预期。
错误代码
EINTR 此调用被信号所中断。
EAGAIN 当使用不可阻断I/O 时(O_NONBLOCK),若无数据可读取则返回此值。
EBADF 参数fd 非有效的文件描述词,或该文件已关闭。
举例说明:
例如以下的代码是从节点读取内容:

#define DEVNAME "./sys/devices/bat_adc.14/gpio_buz_pwm"

char dcin_det_val[32];
int fd;

	if((fd = open(DEVNAME, O_RDWR | O_NONBLOCK))!= -1){
         memset(dcin_det_val, 0, sizeof(dcin_det_val));
         read(fd, dcin_det_val, sizeof(dcin_det_val));
         LOGD("dcin_det_val value[char]: %s\n", dcin_det_val);
	} else {
		LOGD("open dev fail: fd[%d]\n", fd);
	}

3、write(将数据写入已打开的文件)

相关函数
open,read,fcntl,close,lseek,sync,fsync,fwrite
表头文件
#include<unistd.h>
定义函数
ssize_t write (int fd,const void * buf,size_t count);

函数说明
write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。当然,文件读写位置也会随之移动。
返回值
如果顺利write()会返回实际写入的字节数。当有错误发生时则返回-1,错误代码存入errno中。
错误代码
EINTR 此调用被信号所中断。
EAGAIN 当使用不可阻断I/O 时(O_NONBLOCK),若无数据可读取则返回此值。
EADF 参数fd非有效的文件描述词,或该文件已关闭。

举例说明:
例如以下的代码是往节点写入1和写入0:

char on[] = "1";
char off[] = "0";

write(fd7, on, sizeof(on)); //往节点fd写入1
write(fd7, off, sizeof(off)); //往节点fd写入0

驱动里面的实现:

152 static ssize_t buz_ctrl_gpio_buz_pwm_store(struct device *dev,
153                                 struct device_attribute *attr,
154                                 const char *buf, size_t size)
155 {
156         u8 wp;
157         u8 ret;
158         ret = sscanf(buf, "%d", (int *)&wp);
170                 if (wp == 0) {
171                         gpio_set_value(gpio_buz_pwm, 0);
172                         if (bat_adc_x_dbg == -1)
173                                 pr_err("\n##[%s():%d] gpio_buz_pwm off\n",
174                                 __func__, __LINE__);
175                 } else if (wp == 1) {
176                         gpio_set_value(gpio_buz_pwm, 1);
177                         if (bat_adc_x_dbg == -1)
178                                 pr_err("\n##[%s():%d] gpio_buz_pwm on\n",
179                                 __func__, __LINE__);
180                 } else
181                         pr_err("I only support 0 or 1 to ctrl buz on or off\n");
182 
183
184         return size;
185 }

如果要写入其他字符,举例说明:

 52     int key_code = 0;
 53     int old_key_code[2];
 54     int adc_val1, voltage;
 55     int adc_val2, state;
 56     int dcin_det_val2;
 57     char write_data[32];
 58     char write_data1[32];
 59     int fd1, fd2, fd3, fd5, fd6;
 60     char adc_bat_val[32], adc_key_val[32], dcin_det_val[32];


154     if((fd3 = open(DEVNAME3, O_RDWR | O_NONBLOCK))!= -1){
155         old_key_code[0] = 0;
156         if(old_key_code[0] != key_code){
157             old_key_code[0] = key_code;
158             old_key_code[1] = state;
159             FL_LD("key_code = %d, state =%d\n", old_key_code[0], old_key_code[1]);
160             snprintf(write_data, sizeof(write_data), "%d,%d", old_key_code[0], old_key_code[1]);
161             write(fd3, write_data, sizeof(write_data));
162             memset(old_key_code, 0, sizeof(old_key_code));
163         }
164         close(fd3);
165     } else {
166         FL_LE(" open fd failed: %d\n", fd3);
167     }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux的c编程-文件节点的打开与读写操作 的相关文章

随机推荐

  • 玩转Mixly – 9、Arduino AVR编程 之 函数

    以下内容源自Mixly官方技术文档 https mixly readthedocs io zh CN latest Arduino AVR 08Functions html 函数 在函数部分 主要分为定义函数和执行函数 需注意 当用户自定义
  • PHP自学教程之PHP加密函数

    数据加密的基本原理就是对原来的明文的文件或数据按某种算法进行处理 使其成为不可读的一定代码 通常称为 密文 通过这样的途径来达到保护数据不被非法窃取和阅读目的 PHP加密的函数主要有 crypt md5 和sha1 函数 还有加密的拓展库M
  • REDIS09_LBS出现背景、GEO算法介绍、算法步骤、剖析、邻近网格位置推算

    文章目录 LBS出现的背景 重新认识经纬度 感性认识GeoHash Geohash算法介绍 Geohash算法步骤 更深入剖析GeoHash 邻近网格位置推算 LBS出现的背景 移动互联网时代LBS应用越来越多 所在位置附近三公里的药店 交
  • Spring Boot + Spring Cloud + Spring Cloud Alibaba 版本对照表

    Json 详细数据 Spring Cloud 版本对应文档 Spring Cloud Alibaba 版本对应文档 spring cloud dependencies 版本 spring cloud 版本 spring boot 版本 sp
  • 4,使用 OpenCV 进行边缘检测

    效果微信扫码查看 原图 sobel X sobel Y sobel XY canny边缘检测 边缘检测是一种图像处理技术 用于识别对象的边界 边缘 或图像内的区域 边缘是与图像相关的最重要的特征之一 我们通过图像的边缘了解图像的底层结构 因
  • 第1组 团队展示

    1 组长博客链接 组长博客 2 团队项目描述 借呗 想借就借无需等待的资源管理平台 3 队员风采 林睿 风格 日常迷糊 喜欢慵懒随性 擅长的技术 还没有可以说得上擅长的技术 会基础的c和c 一点点python 编程的兴趣 想好好学pytho
  • 今日头条最新signature

    最新今日头条sign加密更新了 抽时间看了看 比上次的加密难度增加了许多 接下来讲下加密流程 今日头条获取下一页面的数据时断点位置 我们只需要找到window byted acrawler的生成就可以了 用fiddler拦击服务器返回的的r
  • Sortablejs实现vue项目表格拖动排序

    1 简介 Sortable js是一款优秀的js拖拽库 支持ie9及以上版本ie浏览器和现代浏览器 也可以运行在移动触摸设备中 不依赖jQuery 支持 Meteor AngularJS React Vue Knockout框架和任何CSS
  • Tomcat 9 免安装版 配置教程

    1 首先进入到https tomcat apache org 下载对应版本的TomCat 的 zip 包 解压到PC某个文件夹中 2 进入到目录 解压路径 bin 下 如我的路径参考 D Tomcat apache tomcat 9 0 6
  • Android 使用 okhttp3和retrofit2 进行单文件和多文件上传

    目录 前言 一 单文件上传 二 多文件上传 总结 前言 开发项目中需要进行单文件多文件的上传功能 下面演示的ApiResponse是自己分装的返回值 要根据自己的项目来完成 使用的mvvm框架 kotlin协程 看下大体思路和传参形式 仅供
  • leetcode刷题(9.24总结)

    1 相交链表 题目描述 https leetcode cn problems intersection of two linked lists class Solution def getIntersectionNode self head
  • 不平衡数据处理技术——RUSBoost

    RUSBoost是一个非常简单的针对不平衡数据集的算法 算法如其名 就是RUS Boost RUS random undersampling 随机欠抽样 随机从数据集中抽取一定量的多数类样本和少数类组成平衡分布的训练数据集 Boost 指的
  • linux 给lvm磁盘扩容

    目录 linux 给lvm磁盘扩容 扩容步骤 确认可用空间 创建新的物理卷 将物理卷添加到现有的卷组中 扩展逻辑卷 linux 给lvm磁盘扩容 早上到公司发现磁盘满了 挂载点是一个lvm 跟领导确认后决定先扩容再清理 原先是1T 决定扩容
  • oRACLE错误怎么办,Oracle的常见错误及解决办法

    ORA 12528 TNS listener all appropriate instances are blocking new connections ORA 12528问题是因为监听中的服务使用了动态服务 实例虽然启动 但没有注册到监
  • 解决adbd cannot run as root in production builds问题

    1 验证你的手机是否已经root了 adb shell su 行命令后 变为 即 表示root 成功 2 安装adbd insecure apk adb install adbd insecure apk 3 设置 打开应用将Enable
  • 集成公告|多链NFT游戏Blockchain Monster Hunt即将上线Moonbeam

    用户现可在Moonbase Alpha测试网体验Blockchain Monster Hunt游戏 并计划将于明年Moonbeam启动后上线Moonbeam平台 Moonbeam宣布支持多链NFT游戏Blockchain Monster H
  • 【弱网测试】

    弱网测试简介 1 测试方法及工具 随着互联网的快速发展 越来越多的应用核心功能需要联网实现 现在的网络制式有2G 3G 4G 5G 还有越来越多的公众WiFi 不同的网络环境和网络制式的差异都会对用户使用APP造成一定的影响 弱网测试作为健
  • [Codeforces 1579G] Minimal Coverage

    You are given n lengths of segments that need to be placed on an infinite axis with coordinates The first segment is pla
  • 爬虫获取电影数据----以沈腾参演电影为例

    数据可视化 分析实战 1 1 沈腾参演电影数据获取 1 2 电影数据可视化分析 文章目录 数据可视化 分析实战 前言 1 网页分析 2 构建数据获取函数 2 1 网页数据获取函数 2 2 网页照片获取函数 3 获取参演影视作品基本数据 4
  • Linux的c编程-文件节点的打开与读写操作

    1 open 打开文件 相关函数 read write fcntl close link stat umask unlink fopen 表头文件 include