linux嵌入式开发 文件IO五大常用函数
linux系统编程
I/O
以下函数是系统调用函数 包含在头文件unistd.h里
1.open函数
open(char*, flag, mode)
在fcntl.h文件中声明。函数的作用:创建或打开某个文件,参数:最多有三个参数;
第一个参数,char * 包含有文件名和路径
第二个参数:flag 打开文件的方式
O_RDONLY, O_WRONLY, O_RDWR
O_CREAT: 创建一个文件
O_TRUNC: 打开文件(会把已经存在的内容给删除)
O_APPEND: 追加方式打开文件(不会把已经存在的内容给删除)。
第三个参数:mode 创建文件的权限。
返回值:
成功:文件描述符,它是一个非负的正整数,即文件的ID号,相当于人的身份证号;
出错:-1。
open函数实现touch命令(创建一个文件)
#include "stdio.h" //标准输入输出函数
#include "unistd.h" //包含posix系统调用
#include "fcntl.h" //与fd有关
//argc 参数个数 argv参数列表,其中argv[0]是本文件名
int main(int argc, char* argv[]){
int fd;
fd = open(argv[1],O_CREAT|O_RDWR,0777);
if(fd<0){
printf("error");
return -1;
}
printf("create file success! fd = %d",fd);
close(fd);
return 0;
}
掩码:
open函数进行调用时,会对权限进行,如0777本来权限应该是rwxrwxrwx,但实际上不是,权限会变化
因为
Open 函数创建文件时的权限是:
== mode & (~umask) eg:B111 111 111 & ~(B 000 010 010) = B 111 101 101
使用命令设置掩码值即可 umask 0000
ID号的生成规律:
从0开始累加,
程序进行时(进程),内核会自动打开3个文件描述符,0,1,2,分别对应,标准输入、输出和出错,这样在程序中,每打开一个文件,文件描述符值从3开始累加。
如果在实例程序中:
int fd;
close(0);
fd = open(argv[1],O_CREAT|O_RDWR,0777);
那fd一定会等于 0,因为操作系统会自动分配fd。 每个程序都有0 1 2,如果0没有了,新的fd就会为0,从小到大往上排列。
2.write函数
write(int fd, void *buf, size_t count );
描述:向内核写入数据
第一个参数:向哪一个文件中去写;
第二个参数:向这个文件中写什么内容;
第三个参数:向这个文件中写多少个。
返回值:是实际写的字节数
例子:向b.c中写入"hello linux"
#include "stdio.h"
#include "unistd.h"
#include "fcntl.h"
int main(int argc, char* argv[]){
int fd;
char buf[] = "hello linux";
int wr_ret;
fd = open(argv[1],O_RDWR|O_APPEND,0777);
if(fd<0){
printf("error\n");
return -1;
}
printf("open file success! fd = %d\n",fd);
wr_ret = write(fd,buf,sizeof buf);
printf("how many char I have writed %d\n",wr_ret);
close(fd);
return 0;
}
3.read函数
read(int fd, void *buf, size_t count)
第一个参数:从哪一个文件中去读;
第二个参数:读到什么地方去;
第三个参数:读多少个。
返回值:是实际读的字节数
注意: write和read函数都会在文件中创立一个文件指针,read一次之后,指针会指向读的最后一个字符。如果这个时候再read或write,将从被改变指针位置处进行。若想进行重置,可以用lseek()函数
4.close函数
close(fd)
调用close()函数可以关闭一个打开的文件。
调用成功返回0,出错返回-1,并设置errno;
注:当一个进程终止时,该进程打开的所有文件都由内核自动关闭;
5.leek函数 文件指针重置
lseek(int fd, off_t offset, int whence)
该函数的头文件:sys/types.h unistd.h;
功能:调整读写的位置指针;
第一个参数:要调整的文件的文件描述符;
第二个参数:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移);
第三个参数:当前位置的基点,有三个标志,
SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小;
SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移量。
SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小。
返回值:成功:文件当前的位置,出错:-1。
测试代码,先打开一个文件,再向该文件中写入hello linux,调整指针位置,最后读出内容:
#include "stdio.h"
#include "unistd.h"
#include "fcntl.h"
int main(int argc, char* argv[]){
int fd;
char buf[] = "hello linux";
fd = open(argv[1],O_RDWR|O_APPEND,0777);
if(fd<0){
printf("error\n");
return -1;
}
printf("open file success! fd = %d\n",fd);
int wr_ret = write(fd,buf,sizeof buf);
printf("the byte I have done is:%d\n",wr_ret);
//现在指针位置
printf("the current point of the file:%d\n",lseek(fd,0,SEEK_CUR));
//重置指针
printf("================set point again================");
lseek(fd,0,SEEK_SET);
printf("the current point of the file:%d\n",lseek(fd,0,SEEK_CUR));
char r_buf[128] = {0};
int r_num = read(fd,r_buf,128);
printf("the length I have red is:%d\n",r_num);
printf("the content I have red is %s\n", r_buf);
close(fd);
return 0;
}
编译并测试:
gcc -o lseek lseek.c
./lseek test.txt
./write test.txt
输出为:
open file success! fd = 3
the byte I have done is:12
the current point of the file:12
================set point again================the current point of the file:0
the length I have red is:12
the content I have red is hello linux