昨晚专门抽时间练习了一下文件I/O编程,由于嵌入式Linux是经Llinux裁剪而来的,它的系统调用及用户编程接口API与Linux基本一致,因此,学习Linux中相关内容的基本编程,对以后嵌入式Linux的实际开发是十分有帮助的。
本文介绍几个最最最基本的文件I/O操作函数,如open、close、read、write、lseek等。
1.open
原型:int open(const char *pathname, int flags, int perms)
pathname表示要打开的文件名,flags表示文件要打开的方式,perms表示存取权限。若成功,返回文件描述符(一般用fd表示),失败返回-1。具体的参数请各位自行查阅相关文档。
2.close
原型:int close(int fd)
fd即在上述open函数获得的文件描述符,若成功返回0,出错返回-1。
用法举例:
int fd; if((fd = open("/tmp/jarvis_hello.c", O_CREAT | O_TRUNC | O_WRONLY, 0600)) < 0); { perror("open"); exit(1); } if(close(fd) < 0) { perror("close"); exit(1); }
3.read
原型:ssize_t read(int fd, void *buf, size_t count)
buf是指定存储器读出数据的缓冲区,count指定读出的字节数。成功返回0,否则返回-1。
4.write
原型:ssize_t write(int fd, void *buf, size_t count)
buf是指定存储器写入的数据缓冲区,count是写入的字节数,成功返回已写入的字数,失败返回-1
5.lseek
原型:off_t lseek(int fd, off_t offset, int whence)
offset是偏移量,可正可负(前移、后移),whence有三个参数可供选择:SEEK_SET文件开头,SEEK_CUR文件当前位置,SEEK_END文件结尾。whence配合offset就能确定当前需要操作文件的具体位置了。执行成功,返回文件当前的位移,失败返回-1。
用法举例:
int i, fd, size, len; char *buf = "Hello, i`m Jarivs!"; char buf_r[10]; len = strlen(buf); fd = open("tmp/jarvis_hello.c", O_CREAT | O_TRUNC | O_RDWR, 0666); //省略容错检测 if ((size = write(fd, buf, len)) < 0) { ... //出错处理 } //否则把"Hello, i`m Jarivs!"写入文件成功 lseek(fd, 0, SEEK_SET); //由于刚才写入时改变了文件指针位置,现将它复原到起始位 if ((size = read(fd, buf_r, 10)) < 0) { ... //出错处理 } //否则从文件开始处读出10个字节成功 close(fd); ....... //省略
对于有心学习Linux编程的你来说,仅仅看是不够的,起码要在自己的平台环境上,把程序敲敲,看究竟是否实现了自己预想的效果。以上仅对最基本的文件I/O操作函数进行介绍,更多内容我将在之后的学习记录中与大家分享,若有错漏之处恳请各位看官指出。