【Linux进阶】系统调用之文件操作

目录

一、C语言文件操作回顾

二、文件描述符

三、Linux文件操作有关的系统调用

1.打开文件操作

函数介绍

参数介绍

2.读文件操作

函数介绍

参数介绍

3.写文件操作

函数介绍

参数介绍

文件关闭操作

函数介绍

参数介绍 

四、写一段程序对普通文件进行拷贝


一、C语言文件操作回顾

首先编写这样一段C语言代码,对文件进行读操作

#include <stdio.h>
int main()
{
    FILE* fp;
    fp = fopen("test.txt", "r");
    if (fp == NULL)
    {
        exit(1);
    }

    while (!feof(fp)) //读文件
    printf("%c", fgetc(fp));    

    fclose(fp);
    return 0;
}

对上述代码进行分析来看,C语言文件操作可分为以下三步

  1. 首先定义一个文件指针,并通过fopen函数获取文件信息,并判断是否打开。
  2. 而后通过文件指针对文件进行操作。
  3. 在最后关闭文件。

我们发现,C语言中文件操作依赖于文件指针,其给出了文件操作所需的信息。

而Linux中的文件操作方式与此类似,但不同的是,其依赖于文件描述符。

二、文件描述符

文件描述符(file descriptor)就是内核为了高效管理这些已经被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符来实现。同时还规定系统刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。

Linux对每个打开的文件都有一个文件描述符表格,其记录了文件指针及其对应的文件描述符,简单来说就是存在一个文件指针数组,其数组下标代表了对应文件操作的文件描述符。

文件指针指向该文件对应的文件表,记录文件的使用信息。

文件表中还存在一个i_node的指针,指向真实的文件信息。

如下图所示:

而当我们打开一个新的文件时,会在文件描述符表后新增文件指针及其对应的文件描述符。

例如打开一个test.txt时,表中会在文件描述符为3的位置新增指向test.txt的文件指针。

三、Linux文件操作有关的系统调用

1.打开文件操作

函数介绍

int open(const char* pathname, int flags);//用于打开一个已存在的文件
int open(const char* pathname, int flags,mode_t mode);//用于新建一个文件,并设置访问权限

参数介绍

参数介绍:

pathname:将要打开的文件路径和名称

flags :          打开标志,如 O_WRONLY 只写打开

                    O_RDONLY 只读打开

                    O_RDWR 读写方式打开

                    O_CREAT 文件不存在则创建

                    O_APPEND 文件末尾追加

                    O_TRUNC 清空文件,重新写入

mode:         权限 如:“0600”

返回值:      为文件描述符

2.读文件操作

函数介绍

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

参数介绍

fd:        对应打开的文件描述符

buf :    存放数据的空间

count: 计划一次从文件中读多少字节数据

返回值:为实际读到的字节数

3.写文件操作

函数介绍

 ssize_t write(int fd, const void* buf,size_t count);

参数介绍

fd:        对应打开的文件描述符

buf:     存放待写入的数据

count: 计划一次向文件中写多少数据

文件关闭操作

函数介绍

int close(int fd); 

参数介绍 

fd: 要关闭的文件描述符

四、写一段程序对普通文件进行拷贝

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <assert.h>

int main()
{
	int rfd = open("passwd", O_RDONLY);
	int wfd = open("newfile", O_WRONLY | O_CREAT, 0600);
	if (rfd == -1 || wfd == -1)
	{
		exit(0);
	}

	char buff[128] = {0};
	int num = 0;
	while ((num = read(rfd, buff, 127)) > 0)
	{
		write(wfd, buff, num);
	}

	close(rfd);
	close(wfd);

	exit(0);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值