首页 > 系统相关 >Linux操作文件IO

Linux操作文件IO

时间:2024-12-28 21:31:25浏览次数:5  
标签:文件 IO 标准 描述符 file Linux

Linux操作文件IO

参考自:【北京迅为】嵌入式linux开发指南_v1.1(i.MX6ULL)

文件 IO 是 Linux 系统提供的接口,针对文件和磁盘进行操作,不带缓存机制;

标准 IO 是 C 语言函数库里的标准 I/O 模型,在 stdio.h 中定义,通过缓冲区操作文件,带缓存机制。Linux 系统中一切皆文件,包括普通文件,目录,设备文件(不包含网络设备),管道,fifio 队列,socket 套接字等,在终端输入“ls -l”

可查看文件类型和权限。

文件 IO 是直接调用内核提供的系统调用函数,头文件是 unistd.h,标准 IO 是间接调用系统调用函数,

头文件是 stdio.h,文件 IO 是依赖于 Linux 操作系统的,标准 IO 是不依赖操作系统的,所以在任何的操作系

统下,使用标准 IO,也就是 C 库函数操作文件的方法都是相同的。

对于文件 IO 来说,一切都是围绕文件操作符来进行的。在 Linux 系统中,所有打开的文件都有一个对

应的文件描述符。文件描述符的本质是一个非负整数,当我们打开一个文件时,系统会给我们分配一个文

件描述符。当我们对一个文件做读写操作的时候,我们使用 open 函数返回的这个文件描述符会标识该文件,

并将其作为参数传递给 read 或者 write 函数。在 posix.1 应用程序里面,文件描述符 0,1,2 分别对应着标准输

入,标准输出,标准错误。

image-20241226092829195

image-20241226101824324

image-20241226102000334

1、新建文件IO操作c语言文件

vim add_file.c
#include <stdio.h>  // 引入标准输入输出库

#include <stdlib.h> // 引入标准库,用于exit等函数

#include <sys/types.h> // 引入系统数据类型定义

#include <sys/stat.h> // 引入文件状态操作库

#include <fcntl.h> // 引入文件控制库,用于文件操作

int main(int argc*,char *argv[]) // 主函数,argc为命令行参数个数,argv为参数数组

{

        int fd; // 定义文件描述符变量fd

        // 打开文件"file.c",

        fd=open("file.c",O_CREAT|O_RDWR,0666);

        //O_CREAT表示如果文件不存在则创建,

        //O_RDWR表示读写权限,0666表示文件权限为rw-rw-rw-

        if(fd<0)printf("open is error\n");

        printf("fd is %d\n",fd);

        return 0;	

}

该代码大致意思是在当前目录先打开文件file.c,若没有这个文件,则会先新建,并设置可读可写权限,结束后打印该文件文件描述符

2、交叉编译,赋权,执行

gcc add_file.c -o add_file_out

chmod 777 add_file_out

./add_file_out

注:想在linux中执行c语言构建的程序,需要使用交叉编译链生成对应本机位数和架构的链接文件执行。

例如我使用默认gcc编译出的链接文件类型是ARM64位,对应本机,可直接执行。

3、执行结果:

image-20241226103811086

这意味着open函数成功返回的文件描述符是3。这表示系统为你的进程分配了一个新的文件描述符3来表示file.c文件。由于标准输入、标准输出和标准错误已经使用了文件描述符012,因此file.c文件的文件描述符从3开始。

ls查看,成功新建文件file.c

image-20241226104120195

标签:文件,IO,标准,描述符,file,Linux
From: https://www.cnblogs.com/tianwuyvlianshui/p/18637972

相关文章

  • BAT 获取当前文件夹的名称和文件名
    1.代码如下@echooffsetlocalfor%%Iin("%cd%")doset"folder=%%~nxI"echo%folder%或者@echooffpushd%1&for%%Iin(.)dosetcurr=%%~nIecho%curr%pause 2.选项语法~I-删除任何引号("),扩充%I%~fI......
  • windows与虚拟机linux通过ssh进行连接并上传文件
    windows与虚拟机linux通过ssh进行连接并上传文件windows配置以管理员打开powershell下载和启动安装ssh客服端Add-WindowsCapability-Online-NameOpenSSH.Server~~~~0.0.1.0Add-WindowsCapability-Online-NameOpenSSH.Client~~~~0.0.1.0Start-ServicesshdSet-Servic......
  • [Java/网络/HTTP(S)] 基于`Http(s)URLConnection`的网络请求工具(HttpRequestUtils)
    1序轻量级HTTP网络请求工具,接续:[JavaSE/JDK/网络]核心源码精讲:java.net.HttpURLConnection-博客园/千千寰宇[身份认证/JWT]身份认证方案与HTTP请求中AuthorizationHeader-博客园/千千寰宇【推荐】[网络/HTTPS/Java]PKI公钥基础设施体系:数字证书(X.509)、CA机构......
  • mybatis一对多collection select
     mybatis一对多collectionselect在MyBatis中,处理一对多关系时,通常会在映射文件中使用<collection>元素,并在其中嵌套一个<select>元素来实现对关联表的查询。这种方式允许你从一个表(称为“一”的一方)中查询数据,并同时获取与其关联的多个表(称为“多”的一方)中的数据......
  • WPF ViewPort3D ModelVisual3D GeometryModel3D MeshGeometry3D Positions Normals
    <Windowx:Class="WpfApp107.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft......
  • .NET Bioss相关数据读写
    本文我们介绍针对Bios如何读取、写入数据,比如最常见的SN读取以及烧录WMI查询先看看WMI方式,可以用于查询和管理Windows系统的各种信息,包括读取BIOS信息WMI-Win32_BIOS,可以查看Bios版本、制造商以及BiosSn等:1varsearcher=newManagementObjectSearcher("SELE......
  • Linux中查看某进程所打开的所有文件
    在Linux中,如何查看某进程所打开的所有文件?在Linux中,查看某个进程所打开的所有文件主要可以使用lsof命令。下面是详细的步骤:确定进程ID(PID):首先,你需要知道你想查询的进程的进程ID。这可以通过多种方式完成,例如使用ps命令配合grep来查找进程名称并提取PID。例如,如果你想查找名......
  • SOCS0100 Computational Tools
    SOCS0100 Computational Tools for Reproducible Social ScienceSecond Summative AssignmentGuidelines for Completing and Submitting SOCS0100 Assignment:•Thisassessmentisdueon 13 January 2025, 1pm and shallbe submitted on Moodle.......
  • 如何使用 Firewalld 设置 Linux 防火墙
    简介在Linux中,防火墙是一个应用程序或服务,它使用预定的规则集来过滤或控制进出Linux服务器的网络流量。通常将防火墙配置为允许所需的流量通过,同时阻止其余的外部流量。Firewalld是一个用于Linux系统的防火墙管理解决方案。它是一个服务守护进程,提供可自定义的基于......
  • [PA2019] Desant Solution
    [PA2019]DesantSolution原题链接。题目大意:给定一个长为\(n(n\le40)\)的排列,对于每个\(i\)求出长度为\(i\)的子序列逆序对最少有多少,并且求出有多少个长度为\(i\)的子序列逆序对最少。解题思路:首先有一个暴力的做法,设\(f_{i,S}\)表示考虑完前\(i\)个数,选择了集......