您的位置:首页 > 其它

嵌入式开发IO基础

2017-07-31 20:05 141 查看
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:本文件所对应的设备的设备号(仅限于设备文件,即字符设备文件,和块设备文件)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息