linux下io口操作你,Linux下的IO操作

Linux下的IO操作

C语言中的IO操作

函数

描述

fopen

打开一个文件

fwrite

向指定文件写入数据

fread

从文件读取数据

fseek

指定当前文件下的光标位置

fclose

关闭一个文件(注意,在文件试用网完毕后要关闭文件,避免造成资源泄漏)

example:

向文件写入数据:

19350892f88e389d18f6fee0b684a854.png

5675899c90a5a00355884e646c12a537.png

从文件读取数据

dae37962847f9d7424079322ad8359d3.png

b6bd4900c682e5988faedbf99af27518.png

输出数据到终端:

7e84cb9961031916dceea1367e74b8be.png

ebf74dd5e143b21ade8e0baa8b7f6bb1.png

文件打开方式的总结:

打开方式

描述

r

只读方式打开

r+

读写方式打开,文件不存在则报错,文件存在则清空原有内容

w

只写方式打开

w+

读写方式打开,文件不存在则创建,文件存在则清空原有内容

a

追加方式打开

a+

读和追加方式打开,文件不存在则创创建,文件存在则在文件的结尾部分追加写

b

表示二进制文件写入读取追加

t

表示文本文件写入读取追加

Linux系统下的IO操作

接口:

#include #include int open(const char* pathname, int flags);

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

pathname:要打开或创建的文件

flags

描述

O_CREAT

文件不存在则创建

O_RDONLY

只读方式打开

O_WRONLY

只写方式打开

O_RDWR

读写方式打开

O_APPEND

追加方式打开

O_EXCL

搭配O_CREAT使用

O_TRUNC

mode:设置文件的权限设置之前要加上umask(0)来临时置空系统默认权限位

0ac5b7b929101f7efad03ba7fdabe7e6.png

7916df2d458fe52ec174d23312295ae7.png

40af0dfff4fba2f1f1e37739240e06f0.png

4aa6901bbdb8491564aaddcab8f56943.png

文件描述符fd

文件描述符:

4344424ae5ee8d969d8bbf6166738629.png

如图所示,系统对程序的描述是一个task_struct结构体,在结构体中有一个files指针,这个指针指向一个file_struct结构体,在这个结构体中存在fd_array[]数组,这个数组的下标 就是文件描述符fd,通过这个下标,我们可以访问到这个文件。进而对文件进行操作。

文件描述符的分配规则:

文件描述符是按照从前往后找,找到第一个没有被分配的下标做为该文件描述符。

c4386461f94fcd9ef18c28b21a84f7ac.png

283593782277e97b0c465a4116702d98.png

e79585fc40f0e8661966f0185bec7711.png

0代表标准输入,1代表标准输出, 2代表标准错误

重定向

当标准输出的文件描述符被关闭时,本该输出到终端的输出被输出到1号描述符描述的文件中去了,这种现象称之为输出重定向。

常见的重定向有:>> , >, <

d00e2d84a1040535f96660205494981e.png

90a7d47b238b8751f963fceb8e20a544.png

19afa01bc7c10fe278ffb592df23e067.png

printf和fwrite库函数自带缓冲区,而write系统调用接口没有提供缓冲区。

文件描述符和文件流指针的关系:

文件流指针FILE是一个结构体,成员就是文件描述符

库函数封装了系统调用接口,因此,库函数的调用归根结底是系统调用接口的使用

我们通常所说的是缓冲区也就是文件流指针结构体中定义的缓冲区。这个缓冲区通常被称为用户态缓冲区。

动态库和静态库

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中,程序运行的时候不需要静态库

动态短库(.so)程序在运行的时候链接动态库中的代码,多个程序共享使用库的代码

动态库链接只链接包含它用到的函数入口地址的一个表

动态库更加节省磁盘空间

动态链接静态链接的生成方式:

bd8bb89c766c317511de9c1521c21b57.png

静态库的打包:

//生成汇编代码

gcc -c [.c文件] -o [.o文件]

//静态库打包

ar -cr lib[静态库名称].a [.o文件]

静态库的使用:

生成可执行程序时链接使用:

1、将库文件放在指定路径下 /usr/lib64 /usr/lib

2、设置链接库的搜索路径环境变量 export LIBRARY_PATH=$LIBRARY_PATH:.

3、使用gcc [.c文件] -o [目标文件] -L[path] -l[库名称]

动态库的打包:

//生产汇编代码

gcc -c -fPIC [.c文件] -o [.o文件]

//动态库打包

gcc -shared [.o文件] -o lib[动态库名称].so

-fPIC选项是产生位置无关代码

动态库的命名方式lib***.so

查看动态库的目录列表:

动态库的使用:

运行时可执行程序时加载使用:

1、将库文件放在指定路径下 /usr/lib64 /usr/lib

2、设置链接库的搜索路径环境变量 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

019e3952dfbc6da792675a5626509a18.png

d633895fafa4085be781a9e38381bfe1.png

文件系统

命令:

ls -l

stat [文件名称]

功能:

查看文件列表,查看文件的详细信息

02d36032ff5118c0598bf9106e3b1125.png

ls -l包含的信息:

1、模式

2、硬链接数

3、文件的所有者

4、文件的所属组

5、文件的最后一次修改时间

6、文件的大小

7、文件名称

3798edc7c8a0ec23192a9f6c3149ab2a.png

stat [文件]包含的信息

文件名称,文件大小,文件的块大小,文件的IO块大小,文件类型

文件的所属设备,文件的Inode节点,文件的硬连接数,文件的权限,文件的所有者id,文件的所属组id文件所处环境

文件的最近修改,最近访问,最近改动时间

Inode:

Inode包含文件的源信息

1、文件的字节数

2、文件的所有者

3、文件的所属组

4、文件的读写执行权限

5、文件的时间戳,ctime Inode的创建时间,mtime文件内容上一次修改时间,atime文件最后一次访问时间

6、文件的链接数

7、文件数据的block位置

c456c35d4540190793d40b4ac1559e26.png

目录项:

目录下的文件名和文件的Inode节点号

查找文件的流程:

打开目录文件,读取目录项信息,通过文件名找到文件的Inode节点号->通过Inode节点号找到文件系统在Inode区域中的Inode节点,再通过Inode节点储存的文件数据储存位置,找到文件在数据区域存储的数据

创建一个新文件的操作:

1、储存属性:内核先找一个空闲的节点,把文件信息记录到其中

2、数据储存:将信息分块记录在不同的磁盘块中

3、记录分配情况:内核在Inode的磁盘分布区间记录存放块位置顺序

4、添加文件名称到目录项:内核将入口添加到目录,文件名和Inode之间的对应关系将文件名和文件的内容及书写连接起来。

软链接和硬链接

硬链接:

硬链接就像是文件的别名,它有自己的目录项,但是没有单独的Inode节点和数据区,一个文件每多一个硬链接,它的Inode节点的 链接数就会+1,这个Inode节点对应多个不同名称的文件,可以通过任意一个文件名称访问这个文件,每删除一个文件,该文件的Inode节点的链接数就会-1,当链接数为0的时候,这个文件才被真正的删除。

因此,删除源文件,我们依然可以访问到这个文件,当且仅当这个文件的链接数>0

创建硬链接的方法:

命令:

ln [源文件] [硬链接文件]

功能:

为指定文件创建硬链接

bc44929b6ca9d0918238fef52bd48fcb.png

软链接:

软链接是一个独立的文件,有自己的目录项,Inode节点,数据区。可以理解为是源文件的快捷方式(注意,这里提到的快捷方式并不准确,并不是Windows系统下的那个快捷方式)通过软链接文件可以访问到源文件,当源文件被删除时,这个软链接将不再访问到源文件。

命令:

ln -s [源文件] [软链接文件]

功能:

为文件创建软链接

5c2cfe4ed67d0267cd367e61dad22c1a.png

软链接和硬链接的区别

区别项

软链接

硬链接

是否针对目录

可以

不可以

是否产生新文件

是新文件

是源文件的别名

是否跨分区

可以跨分区

不可跨分区(每个文件系统都有自己的文件系统的划分的超级快,Inode位图和data位图,以及Inode节点和data数据)

删除源文件是否可以继续访问

不可以访问

无影响,除非链接数<0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux下,可以使用sysfs文件系统来进行GPIO的测试。sysfs是Linux内核提供的一种虚拟文件系统,可以用来访问内核和硬件设备的一些属性和状态信息。GPIO子系统会在sysfs文件系统中创建相应的目录和文件,从而让用户可以通过文件操作来进行GPIO的测试。 以下是在Linux使用sysfs文件系统进行GPIO测试的简单步骤: 1. 确认GPIO的编号 在进行GPIO测试之前,需要先确认GPIO的编号。可以通过查阅开发或芯片的文档来获取GPIO的编号。在树莓派上,可以使用`gpio readall`命令来查看GPIO引脚的编号和状态。 2. 导出GPIO使用GPIO之前,需要先将其导出到sysfs文件系统中。可以通过以下命令将GPIO导出: ``` echo [gpio编号] > /sys/class/gpio/export ``` 例如,将GPIO17导出到sysfs文件系统中可以使用以下命令: ``` echo 17 > /sys/class/gpio/export ``` 3. 配置GPIO的方向 在使用GPIO之前,需要先将其配置为输入或输出模式。可以通过以下命令来配置GPIO的方向: ``` echo [in/out] > /sys/class/gpio/gpio[编号]/direction ``` 例如,将GPIO17配置为输出模式可以使用以下命令: ``` echo out > /sys/class/gpio/gpio17/direction ``` 4. 控制GPIO的电平 在GPIO配置完成之后,就可以通过sysfs文件系统来进行GPIO的读写操作了。可以通过以下命令来控制GPIO的电平: ``` echo [0/1] > /sys/class/gpio/gpio[编号]/value ``` 例如,将GPIO17设置为高电平可以使用以下命令: ``` echo 1 > /sys/class/gpio/gpio17/value ``` 将GPIO17设置为低电平可以使用以下命令: ``` echo 0 > /sys/class/gpio/gpio17/value ``` 5. 取消导出GPIO 在GPIO测试完成之后,需要将其从sysfs文件系统中取消导出。可以通过以下命令来取消GPIO的导出: ``` echo [gpio编号] > /sys/class/gpio/unexport ``` 例如,取消GPIO17的导出可以使用以下命令: ``` echo 17 > /sys/class/gpio/unexport ``` 通过sysfs文件系统进行GPIO测试是一种简单的方法,但也存在一些限制,例如无法实现高速IO操作和复杂的IO控制。对于一些需要高速IO操作和复杂IO控制的应用场景,可能需要使用专门的GPIO库或驱动程序来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值