Linux之read write open lseek用法

Linux的IO接口函数(一)


前言`

本文主要讲解了open(),read(),write(),lseek()的使用。并通过两段程序来实现文件创建,和文件复制的功能


`

一.如何学习linux应用层的高级编程:

学习内核提供的接口函数,学会其功能,参数,返回值。Linux内核提供的接口函数,用来给应用层提供服务和保护内核。

二、函数介绍

1.open

Fd=open((char*)“路径+文件名“,flag,mode);
flag是以宏定义方式的系统定义好的一些可选择变量,不同值对应不同的意义,可以查找得到。
Fd为文件描述符,是一个非负的正整数,但是出错时open会返回-1。即文件的ID号。内核采用ID号的方式标识这些文件。通过命令ls -lai 可以查看文件的ID号

通过open函数实现touch命令
代码如下(示例):

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>//unistd和fcntl两个头文件提供了相关的文件操作接口函数
Int main(int argc,char *argv[])
{
	Int fd;
	fd=open(argv[1],O_CREAT|O_RDWR,0777);//创建一个文件,同时以读写方式打开,并赋予755的权限。这里用命令行参数作为文件名传入open
	if(fd<0)
	{
		printf(“creat file %s failure\n”,argv[1]);
		return -1;
	}
	close(fd);
	return 0;
}

权限的相关说明:
对于open函数创建的文件的权限它是以一个计算方式得出的。
(1)首先系统有一个umask值,可以用umask命令查看;同时也可以用umask 0XXX命令修改,其中0是固定的,代表八进制,而XXX是任意三位八进制数。
(2)然后最终权限值是mode&&(!umask),因而umask也称为掩码。

2.read

num=read(int fd,void *buf,size_t count);
num是函数的返回值,表示成功读取的字节数。并不是想读多少个实际就可以读多少个。
第一个参数是open函数返回的文件描述符,用来表示向哪一个文件读。
第二个参数是指针,指向缓存单元的首地址。
第三个是想要读的字节数。

3.write

num=write(int fd,void *buf,size_t count);
num是函数的返回值,表示实际写入的字节数,因为内核的缓存是有限的,并不是想写多少字节就会实际写入多少字节。
第一个参数是open函数返回的文件描述符,用来表示向哪一个文件去写。
第二个参数是指针,指向要写入内容的首地址单元。
第三个参数是想要向文件写入的字节数。

4.lseek

lseek(int fd,off_t offset,int where);用来调整读写的位置指针
头文件为:sys/types.h unistd.h
第一个参数:是要调整的文件描述符
第二个参数:偏移量,用来移动文件指针,单位是字节,可正可负。
第三个参数:是位置的基坐标。
SEEK_SET:基坐标是文件开头。
SEEK_CUR:基坐标是文件指针的当前位置
SEEK_END:基坐标是文件的末尾
返回值为-1的时候表示失败。

三、实现文件的复制

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
Int main()
{
	int rd_fd,wr_fd;
	char read_buf[128]={0};
	int rd_ret=0;
	if(argc<3)
	{
		printf(“please input src file and des file\n”);
		return -1;
	}
	rd_fd=open(argv[1],O_RDONLY);
	if(rd_fd<0) 
	{
		return -2;
	} 
	wr_fd=open(argv[2],O_WRONLY);
	if(wr_fd<0)
	{ 
		return -3;
	}
	while(1)
	{
		rd_ret=read(rd_fd,read_buf,128);
		if(rd_ret<128) break;
		write(wr_fd,read_buf,rd_ret);
		memset(read_buf,0,128);
	}
	write(wr_fd,read_buf,rd_ret);
	close(rd_fd);
	close(wr_fd);
	return 0;
}



  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SigmaBull

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值