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
posted @ 2020-12-15 21:19  lsxkugou  阅读(344)  评论(0编辑  收藏  举报