基于Linux的嵌入式学习

@基于Linux的嵌入式学习内容

Linux IO

标准IO是在标准函数包和stido.h头文件中定义的,它并不依赖于系统内核,具有很强的操作性。而由于在Linux系统中,一切操作皆文件,于是文件IO也就孕育而生,它相对标准IO操作更为精简,却在Linux编程中起到了至关重要的作用。

标准IO

FILE *fp(stream) 定义一个文件流指针(存放该文件的指针地址)
标准IO库中的函数:
fopen fclose
fread fwrite
fflush
fseek
fgetc getc getchar
fputc putc putchar
fgets gets
printf fprintf sprintf
scanf fscanf sscanf

关于缓存

  1. 全缓存[4096bytes]: 输入输出是对文件的操作,①缓存满时溢出则刷新 ②exit或return(程序正常结束)时刷新 ③调用fflush函数时刷新;
  2. 行缓存[1024bytes]: 输入输出是对输出终端(屏幕)的操作,①缓存满时溢出则刷新 ②exit或return(程序正常结束)时刷新 ③调用fflush函数时刷新 ④遇到换行(‘\n’)时刷新
  3. 不缓存[0bytes]: 顾名思义不进行缓存,直接调用系统接口 。

argc

命令行参数个数;
例:linux@ubuntu:./a.out log1.txt log2.txt 则 argc = 3

argv

指向各个参数的各指针所构成的数组;
例:linux@ubuntu:./a.out log1.txt log2.txt 则 argv[0] = ./a.out argv[1] = log1.txt argv[2] = log2.txt 最后一个参数以NULL结尾,即 argv[3] = (null)

errno

全局错误码,可用 man 3 perror 查看

strerror

返回错误码中的信息
printf( “%s”, strerror(errno));

perror

根据错误码打印错误原因
perror(“open fail”);

fprintf

int fprintf(FILE *stream, const char *format, …);
将打印内容输出到文件指针流所指文件中

sprintf

int printf(char *str, const char *format, …);
将内容以字符串的方式打印到存储空间(数组)str中

fopen

FILE *fopen(const char *path, const char *mode);
const char *path:文件名字符串,可以包含路径
const char *mode:打开文件方式
“r” 只读
“r+” 读写
“w” 只写,文件不存在则创建,存在则将文件清空
“w+” 读写,文件不存在则创建,存在则将文件清空
“a” 追加写,文件不存在则创建
“a+” 追加读写,文件不存在则创建,从头读,从尾写

fclose

int fclose(FILE *stream);
关闭文件

fgetc

int fgetc(FILE *stream);
从指定文件指针流中读入字符

fputc

int fputc(int c, FILE *stream);
将字符写入指定文件指针流

fgets

char *fgets(char *s, int size, FILE *stream);
从指定文件指针流中往存储空间 s(数组)中读取字符串
ps:
只读取 size - 1 个字符,并在最后添加 ‘\0’
遇 ‘\n’ 同样也会结束读取并在最后添加 ‘\0’

fputs

int fputs(const char *s, FILE *stream);
将存储空间 s(数组)中的字符串写入指定文件指针流

fread

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
从文件指针流中读取内容存放于存储空间 str 中
size:对象大小
nmemb:对象个数

fwrite

size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream);
将存储空间 str 的内容写入文件指针流

fseek

int fseek(FILE *stream, long offset, int whence);
改变文件指针流中光标的位置
offset > 0 后移
offset < 0 前移
whence 光标起点
SEEK_SET 置于开头
SEEK_CUR 置于当前
SEEK_END 置于尾部

rewind

void rewind(FILE *stream);
将文件指针流光标置于开头

ftell

long ftell(FILE *stream);
获取文件指针流光标当前位置与开头的偏移量
ps:
若光标已在文件尾部,此时再次后移n个位置,则文件扩大n个大小

getchar

int getchar(void);
在 scanf 输入数据后加上 getchar() 避免读取多余的 ‘\n’

文件IO

特点:不带缓存,系统调用,遵循 POSIX 标准
int fd 定义一个文件描述符
文件IO使用的函数:
open
close
read
write
lseek

open

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
返回值为文件描述符 fd = open();
pathname: 文件路径 argv[1]
flags: 文件权限
mode: 指定新建文件权限(存在 O_CREAT 时必须加上)
操作权限:
“r” 只读:O_RDONLY
“r+” 读写:O_RDWR
“w” 只写:O_WRONLY | O_CREAT | O_TRUNC,0666
“w+” 读写:O_RDWR | O_CREAT | O_TRUNC,0666
“a” 追加读:O_WRONLY | O_CREAT | O_APPEND,0666
“a+” 追加读写:O_RDWR | O_CREAT | O_APPEND,0666

close

int close(int fd);
关闭文件

read

ssize_t read(int fd, void *buf, size_t count);
从文件中读取内容到存储空间 buf(数组) 中

write

ssize_t write(int fd, const void *buf, size_t count);
将存储空间 buf 中的内容写入文件

lseek

off_t lseek(int fd, off_t offset, int whence);
返回值为光标与首位的相对偏移量

目录IO

同文件IO一样也是Linux中独有的操作
DIR *dirp 定义一个目录指针流
目录IO使用的函数:
opendir
closedir
readdir

opendir

DIR *opendir(const cahr *name);
打开一个目录
DIR *dirp = opendir(const cahr *name);
name: 目录所在路径

closedir

int closedir(DIR *dirp);
关闭目录

readdir

struct dirent *readdir(DIR *dirp);
读取目录下的内容
目录结构体:
struct dirent{
ino_t d_ino; 目录文件的iNode号
off_t d_off; 在目录文件中的偏移量
unsigned short d_reclen; 目录文件名长
unsigned char d_type; 文件类型 b,c,d,-,l,p,s
char d_name[256]; 目录文件名
};
目录中文件类型(d_type):
块设备(b) DT_BLK
字符设备© DT_CHR
目录文件(d) DT_DIR
有名管道§ DT_FIFO
符号链接(l) DT_LNK
常规文件(-) DT_REG
套接字文件(s) DT_SOCK
未知文件 DT_UNKNOWN

Linux静态库和动态库

ldd 该命令用于查看程序或库文件所依赖的共享库列表
ldd -v (文件名)
库的命名规则:lib c . so . 6
lib:前缀
c:库名
so:后缀(a:静态库 so:动态库)
6:库文件版本号

静态库

静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库。

静态库制作:
gcc -c max.c -o max.o 将c源文件(.c)编译成目标文件 (.o)
ar crs libmax.a max.o 创建静态库文件
ar -t (库名) 查看库文件由哪些文件生成
gcc main.c -L . -I . -lmax (-o 另命名) 生成运行文件

动态库

动态库使进程可以调用不属于其可执行代码的函数,函数的可执行代码位于一个 动态库文件中,该文件包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。动态库还有助于共享数据和资源,多个应用程序可同时访问内存中单个动态库副本的内容。

动态库制作:
gcc -FPIC -c max.c 将c源文件(.c)编译成目标文件 (.o)
gcc -shared max.o -o libmax.so 创建动态库文件
gcc main.c -L . -I . -lmax (-o 另命名) 生成运行文件
使用动态库时需要把动态库路径给加载器:
①sudo cp libmax.so /usr/lib 把动态库移到加载器路径
②export LD_LIBRARY_PATH = (动态库所在路径) 建立环境变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值