【从零开始的嵌入式生活】文件I/O 2——文件IO和库(2)

简介: 【从零开始的嵌入式生活】文件I/O 2——文件IO和库(2)

通过系统提供的宏来判断文件类型:

st_mode & 0170000


S_ISREG(st_mode) 0100000

S_ISDIR(st_mode) 0040000

S_ISCHR(st_mode) 0020000

S_ISBLK(st_mode) 0060000

S_ISFIFO(st_mode) 0010000

S_ISLNK(st_mode) 0120000

S_ISSOCK(st_mode) 0140000

通过系统提供的宏来获取文件访问权限:

S_IRUSR 00400 bit:8

S_IWUSR 00200 7

S_IXUSR 00100 6

S_IRGRP 00040 5

S_IWGRP 00020 4

S_IXGRP 00010 3

S_IROTH 00004 2

S_IWOTH 00002 1

S_IXOTH 00001 0

综合示例


#include <dirent.h>
#include <stdio.h>
#include <sys/stat.h>
int main(){
        DIR *dir;
        struct dirent *dent;
        struct stat buf;
        dir = opendir(".");
        if(dir){
                while((dent = readdir(dir)) != NULL){
                        stat(dent->d_name, &buf);
                        printf("%s %d\n", dent->d_name, (int)buf.st_size);
                }
        }
        return 0;
}


程序库

库的基本概念

库是一个二进制文件,包含的代码可被程序调用,事先编译好的,可以复用的代码。

标准C库、数学库、线程库……

库有源码,可下载后编译;也可以直接安装二进制包 /lib 、/usr/lib

在OS上运行的程序基本上都要使用库。使用库可以提高开发效率。

Windows和Linux下库文件的格式不兼容

Linux下包含静态库和共享库


静态库特点

编译(链接)时把静态库中相关代码```复制到``可执行文件中

特点:


程序中已包含代码,运行时不再需要静态库

程序运行时无需加载库,运行速度更快

占用更多磁盘和内存空间

静态库升级后,程序需要重新编译链接

静态库创建

1。确定库中函数的功能、接口

2.编写库源码hello.c

#include <stdio.h>

void hello(void) {

printf(“hello world\n”);

return;

}

3.编译生成目标文件

$ gcc -c hello.c -Wall

4.创建静态库 hello

$ar crs libhello.a hello.o

5.查看库中符号信息

$nm libhello.a

hello.o:

0000000 T hello

U puts

6.编写应用程序test.c

#include <stdio.h>

void hello(void);

int main() {

hello();

return 0;

}

7.编译test.c 并链接静态库libhello.a

$ gcc -o test test.c -L. -lhello

$ ./test

hello world

共享库

编译(链接)时仅记录用到哪个共享库中的哪个符号,不复制共享库中相关代码

程序不包含库中代码,尺寸小

多个程序可共享同一个库

程序运行时需要加载库

库升级方便,无需重新编译程序

使用更加广泛

共享库创建

1.确定库中函数的功能、接口

2.编写库源码hello.c bye.c

#include <stdio.h>

void hello(void) {

printf(“hello world\n”);

return;

}

3.编译生成目标文件

$ gcc -c -fPIC hello.c bye.c -Wall

4.创建共享库 common

$ gcc -shared -o libcommon.so.1 hello.o bye.o

5.为共享库文件创建链接文件

$ ln -s libcommon.so.1 libcommon.so

6.符号链接文件命名规则

lib<库名>.so

7.编写应用程序test.c

#include <stdio.h>

#include “common.h”

int main() {

hello();

bye();

return 0;

}

8.编译test.c 并链接共享库libcommon.so

$ gcc -o test test.c -L. -lcommon

共享库使用

执行程序


./test
./test: error while loading shared libraries: libcommon.so
cannot open shared object file : No such file or directory


添加共享库的加载路径(环境变量)


export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
./test
hello  world
bye!


把库拷贝到/usr/lib和/lib目录下(极度不推荐)

在LD_LIBRARY_PATH环境变量中添加库所在路径

添加/etc/ld.so.conf.d/*.conf文件,执行ldconfig刷新

写在最后

文件IO今日完结,我尽量一天一更,大家和我一起变强呀!明天开始进入多线程编程的一章!最后三连即可提高学习效率!!!


另外我在更新的就是算法笔记的一些例题笔记,这个系列是用于提高我的算法能力,如果有兴趣对算法领域感兴趣找不到合适的入门文章也可以追更,如果我更新的太慢了请大家点赞收藏,一键三连才能更有更新的动力呀0.0


相关文章
|
1月前
|
搜索推荐 索引
【文件IO】实现:查找文件并删除、文件复制、递归遍历目录查找文件
【文件IO】实现:查找文件并删除、文件复制、递归遍历目录查找文件
34 2
|
1月前
|
编解码 Java 程序员
【文件IO】文件内容操作
【文件IO】文件内容操作
47 2
|
1月前
|
存储 Java API
【文件IO】文件系统操作
【文件IO】文件系统操作
40 1
|
1月前
|
存储 Java 程序员
【Java】文件IO
【Java】文件IO
35 0
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
4月前
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
|
2月前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
|
3月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
46 2
|
3月前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。
|
3月前
|
缓存 Java
【IO面试题 一】、介绍一下Java中的IO流
Java中的IO流是对数据输入输出操作的抽象,分为输入流和输出流,字节流和字符流,节点流和处理流,提供了多种类支持不同数据源和操作,如文件流、数组流、管道流、字符串流、缓冲流、转换流、对象流、打印流、推回输入流和数据流等。
【IO面试题 一】、介绍一下Java中的IO流