- 标准文件描述符定义在<unistd.h>中,STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO
- 打开一个文件:open()
#include<sys/stat.h>
#include<fcntl.h>
int open(const char *pathname, int flags, …/* mode_t mode*/);
(1)调用发生错误,open返回-1,并将errno设置为相应的错误标志。
(2)flags为位掩码,用于指定文件的访问模式,O_CREATE ,O_RDONLY, O_WRONLY, O_RDWR,O_APPEND; 注:因是位掩码,O_RDWR不等同于O_RDONLY|O_WRONLY
(3)mode为位掩码,用于指定文件的访问权限。如果open flags参数并没有指定O_CREATE标志,则可以省略mode参数。
- O_EXCL,此标志与O_CREATE标志结合使用表明如果文件已经存在,则不会打开文件,且open()调用失败,返回错误,errno为EEXIST。换言之,此标志确保了调用者(open()的调用进程)就是创建文件的进程。
- 读取文件内容:read()
#include<unistd.h>
ssize_t read(int fd, void * buffer, size_t count);
(1)如果read()调用成功,将返回实际读取的字节数,如遇到文件结束(EOF)则返回0
(2)从终端读取字符,一遇到换行符(\n),read()调用就会结束。
- 数据写入文件:write()
#include<unistd.h>
ssize_t write(int fd, void * buffer, size_t count);
write()调用成功,将返回实际写入文件的字节数
- 关闭文件:close()
#include<unistd.h>
int close(int fd);
close()可能执行失败:企图关闭一个未打开的文件描述符;或者两次关闭同一个文件描述符。
- size_t: 无符号整数类型; ssize_t:有符号的整数类型;
- 改变文件偏移量:lseek()
#include<unistd.h>
off_t lseek(int fd, off_t offset, int whence);
(1)文件第一个字节的偏移量为0
(2)offset:指定一个以字节为单位的数值, off_t:有符号整形数
(3)whence:表明应参照哪个基点来解释offset参数。
SEEK_SET: 将文件偏移量设置为从文件头部起始点开始的offset个字节
SEEK_CUR: 相对于当前文件偏移量,将文件偏移量调整offset个字节
SEEK_END: 将文件偏移量设置为起始于文件尾部的offset个字节,也就是说,offset参数应该从文件最后一个字节之后的下一个字节算起
(4)lseek()调用成功会返回新的文件偏移量。
(5)lseek()并不适用于所有类型的文件。不允许将lseek()应用于管道、FIFO、socket或者终端,一旦如此,errno返回ESPIPE
- 通用I/O模型以外的操作:ioctl()
#include<sys/ioctl.h>
int ioctl(int fd, int request, …/*argp*/);
(1) request: 指定了将在fd上执行的控制操作。具体设备的头文件定义了可传递给request参数的常量。
(2)ioctl根据request的参数值来确定argp所期望的类型。通常情况下,argp是指向整数或结构的指针。有些情况,不需要使用argp
(3)ioctl在5350上用于对于芯片的管脚进行I/O设置。常规使用场景是open-->ioctl-->close