嵌入式开发IO基础

来源:互联网 发布:人工智能电影图片 编辑:程序博客网 时间:2024/05/28 19:24

fflush(FILE *stream);//将缓冲区的内容写去文件中。刷新缓冲区
fflush(stdin); //清空输入流,立即输入
fflush(stdout); //清空输出流,立即输出
stdin是系统自动生成的指针标准输入流,stdout是系统自动生成的指针标准输出流


查看各种进制文件:od [ 选项] 文件
-d -D 十进制输出
-o -O 八进制
-x -X 十六进制
小写的以4个字节去读取数据和显示。
大写的则是以8个字节的数据读取和显示。


标准IO:
打开关闭:fopen() / fclose()
读操作: fread() / fgets() / fgetc() / fscanf() ….
写操作: fwrite()/ fputs() / fputc() / fprintf() ….
系统IO:无缓冲区。
open/close /read/write/

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
返回值:成功返回新分配的文件描述符,出错返回-1并设置errno
pathname参数是要打开或创建的文件名,和fopen一样,pathname既可以是相对路径也可以是绝对路径。flags参数有一系列常数值可供选择,可以同时选择多个常数用按位或运算符连接起来,所以这些常数的宏定义都以O_开头,表示or。
以下三个函数必须指定一个:O_RDONLY 只读打开 O_WRONLY 只写打开 O_RDWR 可读可写打开

这些则为可选项:O_APPEND 表示追加。如果文件已有内容,这次打开文件所写的数据附加到文件的末尾而不覆盖原来的内容。 O_CREAT 若此文件不存在则创建它。使用此选项时需要提供第三个参数mode,表示该文件的访问权限。O_EXCL 如果同时指定了O_CREAT,并且文件已存在,则出错返回。O_TRUNC 如果文件已存在,并且以只写或可读可写方式打开,则将其长度截断(Truncate)为0字节。                    O_NONBLOCK方式打开可以做非阻塞I/O(Nonblock I/O)。  第三个参数mode指定文件权限,用八进制表示。一般是0666;

ssize_t read(int fd, void *buf, size_t count); //write函数也是一样参数和返回值类型。
返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回

关于标准IO的缓冲区

1,不缓冲===_IONBF
1.1 一旦有数据,立即刷新(flush)

2,全缓冲(普通文件的默认类型)===_IOFBF
2.1 当缓冲区被填满,立即刷新
2.2 调用fflush(),强制刷新缓冲区,立即刷新
2.3 调用fseek(),调整相应文件的位置,立即刷新
2.4 调用setvbuf()/setbuf(),调整缓冲区类型,立即刷新
2.5 调用fclose(),关闭相应文件,立即刷新
2.6 正常退出程序,会默认自动调用fclose(),立即刷新

3,行缓冲====_IOLBF
2.0 一旦遇到’\n’,立即刷新
2.1 当缓冲区被填满,立即刷新
2.2 调用fflush(),强制刷新缓冲区,立即刷新
2.3 调用fseek(),调整相应文件的位置,立即刷新
2.4 调用setvbuf()/setbuf(),调整缓冲区类型,立即刷新
2.5 调用fclose(),关闭相应文件,立即刷新
2.6 正常退出程序,会默认自动调用fclose(),立即刷新

缓冲区的概念:
输出和输入都有缓冲区,printf是属于行缓冲。遇到了“\n” 才会刷新;


退出函数
========
exit(): 调用exit函数之后,它首先会执行一系列的清理处理,包括调用执行各终止处理程序,关闭所有标准IO流等,然后进入内核。

_exit ()。与exit不同的是,它不进行清理工作而直接进入内核。此函数由POSIX.1说明,放在unistd.h里面。_Exit ()。同样,它也不进行清理工作而直接进入内核。此函数跟exit一样由ISO C说明,放在stdlib.h里面。

文件信息///获取文件的非data之外的信息。
使用:
struct stat *file_info;
stat(filename, file_info);
//int stat(const char *path, struct stat *buf); //On success, zero is returned.
//fstat(int fd,struct stat *file_info);
fstat(fd,file_info);


struct stat
{
dev_t st_dev; /* 文件所在的设备的设备号(含主次设备号) */
ino_t st_ino; /* i节点号(身份证号) */
mode_t st_mode; /* 文件的类型、权限、setuid、setgid、stickybit等 */
nlink_t st_nlink; /* 硬链接数(该文件的引用计数) */
uid_t st_uid; /* 所有者的ID */
gid_t st_gid; /* 所属组的ID */
dev_t st_rdev; /* 设备号 (仅对特殊文件而言) */
off_t st_size; /* 文件总大小,单位字节 */
blksize_t st_blksize; /* 文件存储时的数据块的大小 */
blkcnt_t st_blocks; /* 占用了多少个512b的存储空间 */
time_t st_atime; /* 最近访问时间 */
time_t st_mtime; /* 最近修改时间 */
time_t st_ctime; /* 最近状态改变时间 */
};


Linux七种文件类型:对应判断文件类型。m = st_mode;

S_ISREG(m) is it a regular file?
- :普通文件,open()/read()/write()

S_ISDIR(m) directory?
d :目录文件,mkdir()/readdir()

S_ISCHR(m) character device? 字符设备文件
c :字符设备的节点文件,mknod()/read()/write()

S_ISBLK(m) block device? 块设备文件
b :块设备的节点文件,mknod()/read()/write()

S_ISFIFO(m) FIFO (named pipe)?
p :命名管道文件,mkfifo()/read()/write()

S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
l :软连接文件,symlink()/….

S_ISSOCK(m) socket? (Not in POSIX.1-1996.)
s :本地域套接字,socket()/read()/write()

st_mode 0000 | 000 |000 |000 |000
文件 类型 | 临时权限 |所有者权限 |同组权限|其他人权限
d setuid\setgid\sticky bit rwx rwx rwx
setuid:使用该文件时,得到所有者临时授权。

获取文件的以上的权限信息,可以用st_mode & 对应掩码 进行判断;
而判断文件类型则可以使用对应得宏。可以用man 2 stat

获取特殊文件的设备号:
major(st_rdev)
minor(st_rdev)

st_dev: 本文件所在的设备的设备号 (仅限于非设备文件)
st_rdev:本文件所对应的设备的设备号(仅限于设备文件,即字符设备文件,和块设备文件)

原创粉丝点击