嵌入式之系统IO编程综述

linux 系统中,文件IO的流程
在这里插入图片描述
文件IO有5个函数:open() read(),write(),close(),leek()。
write()函数编写,它等同printf()函数,但是引用的更为直接,它直接写到内核里面
是unsitd.h头文件里面包含
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1、open-打开或者创建一个文件
open(char *, flag, mode)在fcntl.h文件中声明,函数的作用:创建或这打开文件
参数:最多三个参数
char * 包含有文件名和路径
flag 打开文件的方式
mode 创建文件的权限

flag功能
O_RDONLY只读
O_WRONLY只写
O_RDWR读写
O_CREAT创建一个文件
O_EXCL检测文件是否存在
O_TRUNC打开文件覆盖
O_APPEND打开文件追加

编写一个open()函数,
在这里插入图片描述
open(传入的值,创建一个文件夹 | 具有读写权限 , 权限命令为777)
运行结果为
在这里插入图片描述
创建文件的权限:mode &(~umask)它是权限命令码和掩码的与得出的结果
返回值

成功出错
文件表述符 文件的ID号返回-1

使用追加命令O_APPEND
在这里插入图片描述

在这里插入图片描述

编译后 将内容添加到b.c文件中,使用echo命令
echo 添加内容到 > 指定文件
运行文件./append
运行成功
write()函数-写一个数据到文件
write(int fd, void *buf, size_t count);在fcntl.h库文件中声明

参数描述
int fd当前文件的innode输入,就是写到哪个文件
void *buf写的内容buf
sizeof_t写多少个字节sizeof_t

返回值:实际读的字节数
例子
在这里插入图片描述
这里向b.c文件写入一个hello linux 字符串
在这里插入图片描述
编译运行
在这里插入图片描述
通过查看可以得到b.c文件里面的内容
read()函数和write()函数相同
在这里插入图片描述
在这里插入图片描述
编译运行结果,在这里read_buf读不出数据是因为在同一个文件中,写数据的时候指针已经往下移动,没有重新返回,所以读取的时候读到后面的数据,后面的数据为空

lseek()函数
所以我们这里引用到leek()函数 -读取一个文件的位置指针
lseek(int fd, off_t offste,int whence); 在sys/types.h unistd.h库中声明
作用:调整读写的位置指针

参数描述
int fd当前文件,写到那个文件
off_t offset偏移量,每读写操作所移动的距离,单位是字节的数量,可正负,(正前移负后移)
int whence当前位置的基点,有三个标志: 1、SEEK_SET(文件的开头)2、SEEK_CUR(文件指针的当前位置)3、SEEK_END(文件的结尾)

返回值:成功则返回文件指针的当前位置
错误则返回-1;
例子:
在这里插入图片描述
这里lseek(哪个文件,从哪里开始,文件起始命令);
在这里插入图片描述
第二位正数是向前移动2位,负为后移

CP命令函数的实现
转载自https://blog.csdn.net/QiHsMing/article/details/87888556
这里把前面介绍的文件 I/O 操作综合起来,成为一个完整的文件操作范例。在这个范例 中,先以可写方式打开当前目录下的“hello.txt”文件,如果该文件不存在,则创建文件, 再往文件中写入一个字符串“Hello, welcome to linux world!”,把操作结果输出到终端后, 关闭文件。接着再次以只读模式打开该文件,读取刚才写入的数据,并把结果输出到终端, 最后关闭该文件。
创建 file_wr 目录,打开文本编辑器,输入如程序清单 11.8 所示的代码,命名为 file_wr.c 并保存到 file_wr 目录。

#include <stdio.h> 
#include <unistd.h> 
#include <fcntl.h> 
 #include <errno.h>
 int main(int argc, char* argv[]) 
 { 
   	char sz_str[] = "Hello, welcome to linux world!"; 
	char sz_filename[] = "hello.txt"; 
	int fd = -1;
	int res = 0;
	char buf[128] = {0};
	fd = open(sz_filename, O_WRONLY | O_CREAT,  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);  /* 以只写、创建打开文件  权限模式 mode=0x664 */
	if(fd < 0)
		{ 
		printf("open file \"%s\" failed, errno=%d.\n",  sz_filename, errno); 
		 return -1; 
		 } 
		  res = write(fd, sz_str, sizeof(sz_str));       /* 写文件 */
		  printf("write %d bytes to \"%s\".\n", res, sz_filename);   
		  fsync(fd);            /* 同步文件 */ 
		 close(fd);            /* 关闭文件 */ 
		
		fd = open(sz_filename, O_RDONLY);       /* 从只读方式打开文件 */ 
		if(fd < 0)
		{  
			 printf("open file \"%s\" failed,errno=%d.\n",sz_filename, errno);
			 return -1;
		} 
		 res = read(fd, buf, sizeof(buf));        /* 读文件 */ 
		 buf[res]='\0'; 36  printf("read %d bytes from file \"%s\", data=\"%s\"\n",  res, sz_filename, buf); 
		close(fd);
		 return 0; 
 } 

给 file_wr.c 制作一个 Makefile,用 make 命令来编译。回顾一下 10.2 节关于 Makefile 的内容,把那里介绍的 Makefile 范例复制到 file_wr 目录,修改 Makefile 文件前 3 个变量并 保存,改好后的 Makefile 如
在这里插入图片描述
在这里插入图片描述
进入 file_wr 目录,输入 make 命令,完成编译,运行程序,结果如图 所示
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值