Linux IO操作

文章详细介绍了Linux系统下的IO操作,包括系统IO的文件描述符、open、close、read、write、lseek和sync函数。同时提到了标准IO,即C语言提供的IO接口,以及文件IO的几种模式。示例代码展示了如何使用这些函数复制一个文件。
摘要由CSDN通过智能技术生成


Linux系统下的IO操作分为系统IO和标准IO
系统IO为Linux系统内核提供的API、标准IO为C语言在Linux操作系统下的API

1 系统IO

  • open(filename,flags,mode)
  • write(fd,buff,write_len)
  • read(fd,buff,read_len)
  • lseek(fd,offset,whence)
  • close(fd)
int fd;
fd = open(filename);
lseek(fd,offset,whence);
write(fd,buff,write_len);
read(fd,buff,read_len);
close(fd);

1.1 文件描述符

特殊的索引
实际上是Linux系统下进程的file_struct结构体下的file_array数组下标,数组成员为file_operation操作结构体。

模式
主模式:

  • O_RDONLY:只读模式
  • O_WRONLY:只写模式
  • O_RDWR:可读可写模式
    副模式
  • O_CREAT:新建模式
  • O_APPEND:追加模式
  • O_DIRECT:直接IO模式
  • O_SYNC:同步模式
  • O_NOBLOCK:非阻塞模式

主模式只能有一个
副模式可以使用 | 运算符指定多个

1.2 open、close函数

1.2.1 open函数

包含的头文件

#include <sys/types.h>
#include <sys/stat.h>
#incude <fcntl.h>

函数原型

  • 当文件存在时
int open(const char* pathname,int flags)
  • 当文件不存在时
int open(const char* pathname,int flags,int perms)

返回值:

  • 成功:文件描述符
  • 失败:-1

1.2.2 close

包含的头文件

#include <unistd.h>

函数原型

int close(int fd);

返回值

  • 成功:0
  • 失败:-1

1.3 read_write函数

1.3.1 write函数

包含的头文件

#include <unistd.h>

函数原型

ssize_t read(int fd,void*buff,size_t count);

返回值
成功:

  • count:全部写入
  • 0~count:被异步信号打断
    失败
    -1

1.3.2 read函数

包含的头文件

#include <unistd.h>

函数原型

ssize_t read(int fd,void*buff,size_t count);

返回值

成功:

  • count:全部读取
  • 0~count:剩余文件长度小于count、被异步信号打断
    失败
    -1

复制一个文件到另一个文件

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>

int main(int argc,char **argv)
{
	char buf[512];
	int read_size=0;
	int fd1,fd2;

	fd1 = open(argv[1],O_RDONLY);
	fd2 = open(argv[2],O_WRONLY|O_CREAT,0666);
	if(argc != 3)
	{
		printf("param error!!!");
		return -1;
	}
	if(fd1<0 ||fd2<0)
	{
		printf("open error!!!");
		return -1;
	}
	while(1)
	{
		read_size = read(fd1,buf,512);
		if(read_size<0)
			break;
		write(fd2,buf,read_size);
	}
	close(fd1);
	close(fd2);
	return 0;
}

main函数规定有两个参数

int main(int argc,char** argv)
  • argc表示main函数参数的个数
  • argv表示实际的形参
    如果一个程序名为main,调用该程序>main arg1 arg2,则argc=3,因为第一个参数是main这个程序本身

1.4 lseek和sync函数

1.4.1 lseek函数

需要的的头文件

#include <unistd.h>

函数原型

off_t lseek(int fd,off_t offset,int whence);
  • 若whence为SEEK_SET则基准点为文件起始位置
  • 若whence为SEEK_CUR则基准点为文件当前位置
  • 若whence为SEEK_END则基准点为文件末尾
    offset为偏移量

返回值
成功:文件偏移位置值
失败:-1

1.4.2 sync函数

头文件

#include <unistd.h>

函数原型

void sync(void);

Linux具有页缓存机制,在用户与磁盘之间会有一个页缓存区,当写数据后并不会立即写入磁盘,需要等待页缓存区满了以后才会一起送入磁盘,使用sync函数可以将页缓存区的数据立即写入磁盘。

2 标准IO

C标准库实现了一个IO缓冲区

常见标准IO函数

  • fopen
  • fclose
  • fwrite
  • fread
  • fseek
  • fflush
    使用方法与系统IO方式类似
    在这里插入图片描述

文件IO5大模式

  • 阻塞模式
  • 非阻塞模式
  • IO多路复用
  • 异步IO
  • 信号驱动IO
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

指针到处飞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值