Linux操作文件的底层系统调用

目录

1.概述

2.open的介绍

[3.write 的介绍](#3.write 的介绍)

4.read

5.close的介绍

6.文件描述符


1.概述

C语言操作文件的几个库函数:fopen,fread,fwrite,fclose; 系统调用:open,read,write,close; 系统调用方法实现在内核中;(陷入内核,切换到内核)

2.open的介绍

open重载:两个参数用于打开一个已经存在的文件;三个参数的用于新建一个文件,并设置访问权限;

pathname:文件和路径和名称;

flags:文件的打开方式;

mode:文件的权限,如"0600";

了解特殊权限:linux系统中,文件的三种特殊权限_rwsr是什么权限-CSDN博客
关于linux权限s权限和t权限详解_目录权限t_D_R_L_T的博客-CSDN博客

open的返回值为int,称为文件描述符;

flags的打开标志,如:

O_WRONLY:只写打开;

O_RDONLY:只读打开;

O_RDWR:读写方式打开;

O_CREAT:文件不存在则创建;

O_APPEND:文件末尾追加;

O_TRUNC:清空文件,重新写入;

open的返回值是int,称之为"文件描述符";每打开一个文件,我们就会得到一个文件描述符,这个文件描述符是一个整型,通过文件描述符就可以对文件进行读写这样的操作.open失败返回-1,成功返回一个大于等于0的值; 0,1,2是默认打开的;

0:标准输入
1:标准输出
2:标准错误输出

3.write 的介绍

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

buf:写入的文件内容;

count:要写入多少个字节;

返回值:ssize_t:实际写入了多少个字节;

4.read

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

buf:把文件内容读取到一块空间buf中;

count:期望要读取的字节数; 返回值:

ssize_t:实际读取了多少个字节;

5.close的介绍

关闭文件描述符;

6.文件描述符

文件打开以后,内核给文件的一个编号;(>0的整数)

0:标准输入;

1:标准输出;

2:标准错误输出;

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
    write(1,"hello",5);
    exit(0);
}
//往屏幕(标准输出)写入hello 5个字节
cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <assert.h>
  
  /*
  int main()
  {
      int fd=open("file.txt",O_WRONLY|O_CREAT,0600);//创建新的文件需定义其权限,3个参数
      assert(fd!=-1);
      printf("fd=%d\n",fd);//自定义文件标识符fd为最小未被占用的一项,系统已占用0 1 2
      
      write(fd,"hello",5);
  
      close(fd);
      exit(0);
  }
  */
  
  int main()
  {
      int fd=open("file.txt",O_RDONLY);//文件已经存在,不用定义权限
      assert(fd!=-1);
  
      char buff[128]={0};
      int n=read(fd,buff,127);
      printf("n=%d,buff=%s\n",n,buff);
      close(fd);
      exit(0);
  }

利用读写复制文件

cpp 复制代码
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <assert.h>

int main()
{
      int fr=open("file.txt",O_RDONLY);
      int fw=open("file2.txt",O_RDWR|O_CREAT,0600);
      assert(fr!=-1||fw!=-1);
     char buff[8]={0};
 
      int len;
      while((len=read(fr,buff,8))>0)
      {
          write(fw,buff,len);
      }
      close(fr);
      close(fw);
  
      exit(0);
 }
相关推荐
GeW1 小时前
国产化替代进入深水区之后Linux 与数据库为什么必须走向重建
linux
女神下凡4 小时前
芯参谋(85):Linux_PPI_NAND_驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件·设计规范
12.=0.5 小时前
【持续更新】shell脚本 + Linux命令
linux·运维·服务器
Escalating_xu5 小时前
【Linux 网络编程】五种 I/O 模型与非阻塞 I/O:从“等数据”到正确处理 EAGAIN
java·linux·网络
无言听风雨丶5 小时前
Linux 容器本质探秘:Cgroup 与 Namespace 深度解析与实战
linux·运维·服务器·kubernetes
万联WANFLOW5 小时前
CVE-2026-98432 等漏洞自查:AI 查出的 Linux、Windows 漏洞,运维怎么确认受不受影响
linux·运维·windows·网络安全
OPEN-F6 小时前
Ubuntu 自动登录后 GNOME 远程桌面连不上?一次登录钥匙环锁定的排查与永久修复
linux·运维·ubuntu
硅基手札6 小时前
【Linux 内核专栏 19】20 · 嵌入式子系统 — GPIO·pinctrl·clock·regulator
linux·运维·单片机·linux内核·嵌入式开发·调试定位
默|笙6 小时前
【Linux网络】传输层协议TCP(3)滑动窗口、流量控制
linux·网络·tcp/ip
Linux界最忧郁之人8 小时前
华为云ECS&IMS&AS实战|弹性云服务器、私有镜像、弹性伸缩完整实验
linux·运维·服务器·centos·华为云·openstack