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;
}