Linux文件操作---随手记

Linux文件操作——标准c库对文件操作 指向。 阅读详情

文件定义

狭义

磁盘文件,进而可以是有组织有次序地存储在任何介质(包括内存)中的一组信息

广义

凡是可以产生或者消耗信息的都是文件。(也包括socket)

文件操作方式

系统调用库函数
openfopen
readfread
writefwrite
closefclose
lseek, ioctl…fseek, fgetc, fputc…

系统调用:linux system call 类似windows 的api,为linux特有的系统操作,其中有关文件的操作有:pen, read, write, close, lseek, ioctl, 等
库函数:库函数是编程语言提供的函数集合,比如C的标准输入输出库:stdio.h 提供了以下函数fopen, fread, fwrite, fclose, fflush fseek, etc.
,这些函数不局限于linux操作系统,其他支持该C标准库的操作系统同样可以使用。
在linux 中,库函数对文件的操作实际是对系统调用的相关操作的封装。

创建

系统调用参数
Int creat(const char *filename,mode_t mode)参数mode指定新建文件的读写权限,与umask共同决定文件的最终权限。Umask代表文件创建时去掉默写读写权限,可通过系统调用 int umask(int newmask)修改

打开

系统调用

int open(const char *pathname, int flags); 
int open(const char *pathname, int flags, mode_t mode); 

例子

open(“test”, O_CREAT, 10705)
open(“test”, O_CREAT,  S_IRWXU | S_IROTH | S_IXOTH | S_ISUID)

C库函数

FILE *fopen(const char *path, const char *mode);
ModeComment
r,rb只读打开
W,wb只写打开,文件不存在则创建
a,ab追加方式打开(只写),文件不存在则创建
r+,r+b,rb+读写方式打开
w+,w+b,wh+读写方式打开,文件不存在则创建
a+,a+b,ab+追加读写打开,文件不存在则创建

读写

系统调用

int read(int fd, const void *buf, size_t length);

从文件描述符fd指定的文件中读取length个字节到buf缓冲区

int write(int fd, const void *buf, size_t length);

把length个字节从buf缓冲区写入到文件描述符fd指向的文件中

C库函数

int fgetc(FILE *stream);
int fputc(int c, FILE *stream);
char *fgets(char *s, int n, FILE *stream);
int fputs(const char *s, FILE *stream);
int fprintf(FILE *stream, const char *format, ...);
int fscanf (FILE *stream, const char *format, ...);
Size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
Size_t fwrite (const void *ptr, size_t size, size_t n, FILE *stream);

定位

系统调用

int lseek(int fd, offset_t offset, int whence); 

作用,移动当前读写位置,offset含义取决于whence。
返回值:新的偏移量(成功),-1(失败)

whenceoffset含义
SEEK_SET文件偏移量将被设置为 offset
SEEK_CUR文件偏移量将被设置为 cfo (当前文件偏移量)加上 offset
SEEK_END文件偏移量将被设置为文件长度加上 offset

技巧:currpos = lseek(fd, 0, SEEK_CUR) 返回当前的文件偏移量

C库函数

int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, const fpos_t *pos);
int fseek(FILE *stream, long offset, int whence); 

关闭

系统调用C库函数
int close(int fd);int fclose (FILE *stream);

示例——文本复制

系统调用

#include <unistd.h>  
#include <sys/stat.h>  
#include <fcntl.h>  
#include <stdlib.h>  
 
int main()  
{  
    char c = '\0';  
    int in = -1, out = -1;  
    in = open("Data.txt", O_RDONLY);  
    out = open("copy_system.out.txt", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);  
    while(read(in, &c, 1) == 1)
         {
            write(out, &c, 1);
         }
    close(in);  
    close(out);  
    return 0;  
}  

C库函数

#include <stdio.h>  
#include <stdlib.h>  
  
int main()  
{  
    int c = 0;  
    FILE *pfin = NULL;  
    FILE *pfout = NULL;  
     pfin = fopen("Data.txt", "r");  
    pfout = fopen("copy_stdio.out.txt", "w");     
    while(fread(&c, sizeof(char), 1, pfin))
{
        fwrite(&c, sizeof(char), 1, pfout);
}
    fclose(pfin);  
    fclose(pfout);  
    return 0;  
} 

区别

系统调用(open)C库函数(fopen)
int open(const char *path, int access,int mode)FILE *fopen(char *filename, char *mode)
非缓冲操作缓冲操作
返回 文件描述符返回 文件指针
可用来操作设备文件,套接字,普通文件等一般只操作普通文件,不能操作设备文件
在linux中由内核实现文件操作在linux中间接调用系统调用open
只针对linux多操作系统移植

文件层次

底层上,linux文件系统包括Ext2,等。
向上,则为用户程序提供一个统一的,抽象的,虚拟的文件系统界面。也就是所谓的虚拟文件系统-VFS(virtual filesystem ),虚拟文件系统为用户程序提供了一组标准的,抽象的文件操作——read ,write,lseek 等。也就是我们所谓的 系统调用。(文件操作包括 系统调用和库函数)

图1
这里写图片描述

系统调用open是如何调用驱动的open的

注册字符设备

file_operations misc_fops = { .open= misc_open};
register_chrdev(MISC_MAJOR,”misc”,&misc_fops)

图2
这里写图片描述

系统调用open

图3
这里写图片描述

进程中文件操作的结构

图4
这里写图片描述

Android中的文件系统

Init.rc中的文件分区与文件属性

CommandComment
chmod 改变文件访问权限
chown 改变文件所属和组
mkdir [mode] [owner] [group]在创建一个目录,可选选项:mod,owner,group.如果没有指定,目录以755权限,owner为root,group为root创建.
mount [ ]*尝试mount 到目录. 可以用mtd@name格式以命名指定一个mtd块设备。包含”ro”,”rw”,”remount”,”noatime”
write [ ]*打开的文件并写入一个或多个字符串。

挂载ROM分区到 /system;/data;/cache 分区:

mount ext4 /dev/block/mmcblk0p9 /system ro wait noatime
mount ext4 /dev/block/mmcblk0p12 /data wait nosuid nodev noatime discard
mount ext4 /dev/block/mmcblk0p8 /cache nosuid nodev noatime journal_async_commit

noatime:Linux缺省每次读文件,都要更新这个文件的last access time属性,增加这个noatime选项,则在读文件时不去更改文件的access time属性了,提高文件系统性能

文件属性简介

Linux文件可以分为如普通文件、目录、符号链接文件、字符和块设备文件、套接口文件等。
Umask-代表“剥夺”的权限
Mode 的助记表示法
-R参数循环设置目录下的所有文件及目录
setuid和setgid 位-setuid 和 setgid “ ” 是让程序执行的时候 临时的 的拥有了程序
文件所有者的 uid 和 gid,等程序执行完后再恢复到发起者的权限。
对于目录,如果在某个目录上设置了 setgid 位以后,在这个目录中创建的文件具有该目录的属组权限而不是创建该文件的用户的默认属组

Sticky粘贴位(较少用到)-一个目录即使它的所有权限都开放rwxrwxrwx,如果是设置了粘帖位,除非目录的属主和root用户有权限删除它,除此之外其它用户不能删除这个目录,用途一般是把一个文件夹的的权限都打开,然后来共享文件,象/tmp目录一样。

命令ls -lih
显示结果699679673 -rw-r–r– 1 xxxxx xxxxx 681 2013-05-24 09:16 Android.mk
显示结果688685627 -rw-r–r– 1 xxxxx xxxxx 0 2013-05-24 11:02 Version.inc
涵义(一一对应)Inode;文件种类和权限;硬链接个数;User;Group;大小;最后访问/修改时间;文件/目录名
技巧上面的Version.inc显示有一个硬链接,通过find -inum 688685627可以查找对应硬链接文件,结果另一个文件位于./vendor/Version.inc

Android文件系统的初始权限

tmpfs文件系统类型是基于虚拟内存的文件系统
rootfs,也是一种基于RAM的文件系统,可以看到Android的/是直接建立在RAM上的

android/system/core/include/private/android_filesystem_config.h
定义了各个用户及用户组,并定义了部分目录的用户,用户组,读写权限

Android 系统编译时会使用两个 Android 命令 mkbootfs 和 mkyaffs2image 来生成这些 img文件,这两个命令都会调用文件 android_filesystem_config.h 中预制的权限,来写入这些目录和文件资源初始的访问权限


#define AID_ROOT             0
#define AID_SYSTEM        1000
#define AID_RADIO         1001
…………………………

static struct fs_path_config android_dirs[] = {
    { 00770, AID_SYSTEM, AID_CACHE,  "cache" },
    { 00771, AID_SYSTEM, AID_SYSTEM, "data/app" },
    { 00771, AID_SYSTEM, AID_SYSTEM, "data/app-private" },
    { 00771, AID_SYSTEM, AID_SYSTEM, "data/dalvik-cache" },
    { 00771, AID_SYSTEM, AID_SYSTEM, "data/data" },
    //可以在此处添加新增目录的权限

分别对应:Mode uid gid *prefix


static const struct android_id_info android_ids[] = {
    { "root",      AID_ROOT, },
    { "system",    AID_SYSTEM, },
    { "radio",     AID_RADIO, },
 …………………………

分别对应Name和aid


static struct fs_path_config android_files[] = {
    { 00440, AID_ROOT,      AID_SHELL,     "system/etc/init.goldfish.rc" },
    { 00550, AID_ROOT,      AID_SHELL,     "system/etc/init.goldfish.sh" },
    { 00440, AID_ROOT,      AID_SHELL,     "system/etc/init.trout.rc" },
    { 00550, AID_ROOT,      AID_SHELL,     "system/etc/init.ril" },
    //可以在此处添加新增文件的权限

分别对应:Mode uid gid *prefix

新增设备权限

android/system/core/rootdir/ueventd.rc

/dev/null                 0666   root       root
/dev/zero                 0666   root       root
/dev/full                 0666   root       root
/dev/ptmx                 0666   root       root
/dev/tty                  0666   root       root
/dev/random               0666   root       root
/dev/urandom              0666   root       root
/dev/ashmem               0666   root       root
/dev/binder               0666   root       root
新增设备时在此文件中添加权限

对于新添加的设备,需要在该文件中添加对应的设备权限,否则可能出现无法使用的情况。

文件所有者具有读、写、执行权限 S_IRWXU 00700 文件所有者具有读、写、执行权限 S_IRWXG 00070 用户组具有读、写、执行权限 S_IRWXO 00007 其他用户具有读、写、执行权限 立即下载

相关推荐

避坑指南:你的VASP CI-NEB计算为什么不收敛?常见错误分析与解决思路

本文深入解析VASP CI-NEB计算不收敛的常见问题,提供从结构准备到参数设置的系统解决方案。针对过渡态计算中的能量曲线异常、中间图像偏离等典型问题,详细介绍了诊断方法和实用工具,帮助研究者高效解决CI-NEB收敛难题,提升计算效率。

weixin_29698641的博客 433

文件创建——S_IRWXU

1.API S_IRWXU 可读,可写,可执行 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main() { int fd; fd=creat("/home/bha/file1",S_IRWXU); return 0; } 运行效果: ——@上.

weixin_42900834的博客 5392

Vue3+Vite+Electron桌面应用开发:从零到打包的完整避坑指南

本文是一份详尽的Vue3+Vite+Electron桌面应用开发实战指南。文章从项目初始化、环境配置、主进程构建、Vite深度优化,到最终的打包配置与优化,系统性地讲解了使用现代前端技术栈开发跨平台桌面应用的完整流程,并重点分享了开发与打包过程中的常见“坑点”与解决方案,旨在帮助开发者高效构建稳定可交付的桌面端应用。

hh234的博客 109

C语言创建目录(文件夹)之mkdir

mode方式:可多个权限相或,如0755表示S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH。

qq_43085982的博客 6424

DAX Studio--导出PowerBi数据---(不使用复制表如何快速导出csv文件 / 如何导出百万级/千万级乃至亿级的数据量)多图预警!

多图预警! 1、打开Dax 点击Connect 2、在这里选择正在打开的PowerBi文件,点击Contect 3、选择导出方式--File F、输入指令(输入 EVALUATE ' )单引号可以进行快速提示 5、点击Run 6、选择文件路径,以及保存类型等(一般情况下,我们常用的类型是 txt 或者 第一种 UTF-8 的csv 文件),点击保存即可,稍等片刻,导出完成! 7、导出完成,我这里总计是39W 行的数据量,约20+ 秒完成 ...

STR_Liang的博客 8159

头歌操作系统2.3系统调用命令ls执行的系统调用

设置版本0内核为分析对象。然后一直c直到虚拟机出现。然后一直c就是答案了。

m0_74128952的博客 1万+

mkdir创建目录问题

教训:不能创建多级目录。。。改为逐级创建,或者手动创建上一级目录。测试cpp:#include &lt;sstream&gt; #include &lt;sys/types.h&gt; #include &lt;sys/stat.h&gt; #include &lt;iostream&gt; int main(int argc, char **argv) { int status; ...

qq_36501182的博客 1339

曙光服务器RAID配置避坑指南:MegaRAID SAS 9361-8i实战(含Foreign状态处理)

本文详细解析了曙光服务器搭配MegaRAID SAS 9361-8i控制器的RAID配置全流程,包括RAID0和RAID5的创建、Foreign状态处理及性能优化策略。特别针对磁盘迁移中的Foreign状态问题,提供了系统化的解决方案和高级恢复技巧,助力企业级IT运维提升存储配置的稳定性和可靠性。

weixin_29200741的博客 412

Linux编程目录操作

对于linux文件目录操作函数其实使用命令就能实现,但是其实对于一些命令本质上就是调用系统函数的,比如:madir,umask,chown等命令。所以此篇博客就对文件目录操作的系统函数进行一下总结。(1)stat,fstat,fstatat 获取文件信息 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h>

qq_36675830的博客 1555

model_optimizer将pi05端到端延时进一步优化到68.13ms了

目前在保持灵活性和性能之间找到一个较好的平衡。vit, llm仍然使用onnx->trt_engine的路径,量化可以通过https://github.com/NVIDIA/Model-Optimizer.git支持。同时支持通过cutedsl手写算子进行进一步优化denoise因为步数多,kernel launch多,因此完全通过手写融合算子实现,将所有steps进行一次大的cuda graph capture.

happyAnger6的专栏 60

HandwrittenMathFormulaRecognition:基于YOLOv8的手写数学公式识别系统

输入:包含手写数学公式的图像(拍摄的板书、作业纸等)输出:对应的数字文本形式的数学公式(如LaTeX格式或文本表达式)标准的手写数学表达式数据集,包含在线轨迹及图片,广泛用于公式识别研究。包含近10万对公式图片及对应的LaTeX标注,适合训练公式识别模型。MathBrush公开手写数学公式图像数据集,含多种书写风格。手写数字与符号数据集(MNIST及其扩展)用于基础数学符号的训练。

YOLO 283

文件权限定义S_IRUSR,S_IWUSR,S_IRGRP,S_IWGRP,S_IROTH,S_IWOTH

S_IRUSR:用户读权限 S_IWUSR:用户写权限 S_IRGRP:用户组读权限 S_IWGRP:用户组写权限 S_IROTH:其他组都权限 S_IWOTH:其他组写权限

qq_43751200的博客 1万+

【ComfyUI】多模型 户型图风格渲染效果图

本文介绍了一种基于ComfyUI的室内户型图自动渲染工作流,将平面图转换为风格化效果图。该工作流通过RH_Captioner节点识别空间布局,结合Qwen2.5模型优化文本描述,再使用定制室内设计模型生成渲染图。整个流程包含图像输入、空间识别、文本组织、语言生成、风格转换和渲染输出等9个阶段,各节点协同完成从户型图到效果图的全自动转换。系统融合了语言理解和图像生成技术,可广泛应用于室内设计、装修可视化等领域。

Mr数据杨 3013

Linux 随手记(文件操作)

新建文件夹 mkdir 文件夹名 新建文件 touch 文件名 重命名 mv 文件名 新文件名 将/a目录移动到/b下,并重命名为c mv /a /b/c 复制文件 cp [选项] 源文件或目录 目标文件或目录 cp file.php /usr/file_bak.php cp file.php /usr/ ...

weixin_30318645的博客 96

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【Linux】文件操作

本文摘要: 本文深入探讨了Linux文件操作的核心机制。首先回顾了C语言文件操作与重定向的关系,分析了w/a选项与>、>>的异同。重点讲解了文件描述符(fd)的本质及其分配规则,揭示了fd作为数组下标映射到内核文件结构体的机制。通过dup2系统调用演示了如何实现重定向功能。文章还剖析了缓冲区的作用原理,对比了语言层缓冲区与内核缓冲区的差异,并通过fork实验验证了缓冲区的存在。最后,提供了模拟实现文件接口的代码示例,包含无缓冲区和有缓冲区两个版本,展示了从底层理解文件操作的方法。全文贯穿系

hffh123的博客 1643

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

linux文件操作

4、了解复制cp和移动mv的区别会使用tar命令进行压缩和解压缩,(剪切, 复制)网络中文件的传输,打包传输是最好的。1.所有你可见到的linux机器,都会默认有vi编辑器,但是它不好用,就好比windows的记事本。作用是,简单的说 就是把其他命令的给它的数据,传递给它后面的命令作为参数。完成练习效果,访问你的linux机器地址,看到一个有内容的网址即可。,无论大小写,找出/etc/passwd文件中,包含的root信息。底线命令模式,的w模式,就是写入文件内容,以及创建文件的作用。

歌颂平凡的博客 1306

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【Linux】Linux的文件操作

【Linux】Linux的文件操作

一点一点变好 1951

【Linux文件操作】C库函数操作

在 Linux 系统编程领域,文件操作是开发者必须掌握的核心技能。C 语言标准库提供了一套完善的文件操作函数,这些函数在底层系统调用的基础上进行了封装,既简化了编程复杂度,又保证了良好的跨平台兼容性。本文将系统讲解 Linux 环境下使用 C 库函数进行文件操作的全流程,涵盖文件的创建、打开、读写和关闭等关键环节。​

byte轻骑兵的技术小窝 7658

Linux之文件操作

Linux的终端基本操作 文件管理 目录树结构

2302_79100751的博客 1622

【Linux】应用编程之C语言文件操作

Linux进阶编程之文件操作前言一、工程的创建1、目录结构2、Makefile二、文件的操作1.打开、关闭文件:open、close2.读取、写入文件:read、write3.综合练习三、文件夹的操作1.2.3.最后 前言   对于文件IO来说,一切都是围绕文件描述符来进行的,在Linux系统中所有打开的文件都是一个对应的文件描述符。   文件描述符的本质是一个非负整数,当我们打开一个文件时,系统会给我们分配一个文件描述符。   当我们对一个文件做读写操作的时候,我们使用open函数的时候返回的就是这个文

凉开水白菜的博客 3289

Linux系统下的文件操作

当我们执行完相关操作后,需调用close(fd)函数关闭文件,是因为我们对文件的操作都是针对动态文件进行操作的,而不是对静态文件,当我们对动态文件进行操作后,此时它就与静态文件不同步了,当我们close关闭动态文件时,内核会去更新静态文件。选项打开文件时,如果文件不存在,则会创建一个新文件。open()函数调用成功时,它们会返回一个未被进程打开的最小的文件描述符,可以用于后续的文件操作系统调用。选项打开文件时,如果文件中本来是有内容的,而且为只读或只写打开,则将其长度截为0(清空文件内容)。

m0_73510889的博客 1172

[ linux ] linux 文件操作详解

linux的对文件进行操作对于网安的同胞们来说几乎每天都要用,这里总结的相对比较全安眠,尽可能看完哦,尽管会比较乏味 文章最后有彩蛋~~~ 其实这里介绍的也没有全部写出来,就总结了常用的18个命令 显示文件内容(6个):cat、more、less、head、tail 搜索、排序、去重(三个):grep、sort、uniq 比较(两个):comm、diff 复制、删除、移动(三个):cp、rm、mv 统计(一个):wc 查找(一个):find 压缩解压缩(三个):bzip2、gzip..

qq_51577576的博客 2801

Linux - 文件操作和系统接口

对于文件操作,不知大家是否有过接触,例如(fopen,fclose...等),那么大家在刚接触使用这些文件接口的时候,是否有过一些难以言喻的懵懂感,不仅不太理解,而且难以刻于脑海。本章内容不仅会讲解文件操作内容知识,还会讲授一个重要的概念,这个概念会影响你对于Linux系统编程的学习!对于我们日常使用来言,文件似乎就是我们每天运行的游戏,app(.exe)或者我们写的c语言代码(.c和.cpp等),它们都是在磁盘上存储的。而这种观点知识狭义的,实际上,对于文件有着更广的范域。

fengjunziya的博客 3667

C语言文件操作,linux文件操作,文件描述符,linux下一切皆文件,缓冲区,重定向

为什么我们可以把文件创建在进程当前路径中,当前路径到底是什么意思?我们在运行可执行程序后程序变成了进程,而进程在我们之前的学习中,我们知道进程有进程的pcb结构体,这个结构体中存放了进程的各种信息,那么我们运行进程时所在的路径也会被记录下来,这个路径就是当前进程所在的路径,也就是当前路径的根本意义;下面我们通过实际现象来证明我们思路:由此我们可以清楚的明白所谓的当前路径就是存储在进程的pcb结构体中的进程信息,我们只要通过查找进程的结构体就可以找到我们的当前路径;

m0_75260318的博客 1427
上一篇: 中国天气网api(json格式)
下一篇: Android系统权限及签名
crazy_chen
博客等级 码龄17年 21粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值