Linux文件I/O:基本概念

Linux是一個開源的操作系統,它提供了一套豐富的文件I/O(輸入/輸出)接口,讓用戶和程序可以方便地對文件進行讀寫操作。文件I/O是操作系統中最基本也最重要的功能之一,它涉及到文件的打開、關閉、讀取、寫入、定位、鎖定等操作。本文將介紹Linux文件I/O的一些基本概念,包括文件描述符、標準輸入輸出、文件類型、文件權限、文件系統等。

文件描述符

文件描述符(file descriptor)是一個非負整數,它表示一個已打開的文件的引用。每個進程都有一個文件描述符表,用來記錄該進程打開的所有文件。當一個進程打開一個文件時,操作系統會分配一個最小的未使用的文件描述符給該文件,并將其加入到文件描述符表中。當一個進程關閉一個文件時,操作系統會釋放該文件的文件描述符,并將其從文件描述符表中刪除。文件描述符可以用來對文件進行讀寫操作,也可以用來傳遞給其他函數或系統調用,例如dup、dup2、fcntl、ioctl等。

文件描述符的分配和釋放可以用open和close函數實現,例如:

// 打開一個文件,返回一個文件描述符
int fd = open("test.txt", O_RDONLY); // 以只讀方式打開test.txt文件
if (fd == -1) {perror("open"); // 如果打開失敗,打印錯誤信息exit(1); // 退出程序
}// 對文件進行讀寫操作,使用read和write函數
char buf[1024]; // 定義一個緩沖區
int n = read(fd, buf, sizeof(buf)); // 從文件中讀取數據到緩沖區
if (n == -1) {perror("read"); // 如果讀取失敗,打印錯誤信息exit(1); // 退出程序
}
printf("Read %d bytes from file: %s\n", n, buf); // 打印讀取的數據// 關閉一個文件,釋放一個文件描述符
int ret = close(fd); // 關閉文件
if (ret == -1) {perror("close"); // 如果關閉失敗,打印錯誤信息exit(1); // 退出程序
}

標準輸入輸出

每個進程都有三個預定義的文件描述符,分別是標準輸入(stdin)、標準輸出(stdout)和標準錯誤(stderr)。它們的文件描述符分別是0、1和2。標準輸入通常是鍵盤,標準輸出和標準錯誤通常是屏幕。這三個文件描述符可以被重定向,也就是說,可以將它們指向其他的文件或設備。例如,可以使用>或>>符號將標準輸出或標準錯誤重定向到一個文件中,或者使用<符號將一個文件作為標準輸入。也可以使用管道(|)符號將一個進程的標準輸出作為另一個進程的標準輸入,實現進程間的通信。

標準輸入輸出的重定向和管道可以用shell命令實現,例如:

# 將ls命令的標準輸出重定向到filelist.txt文件中,覆蓋原有內容
ls > filelist.txt# 將cat命令的標準錯誤追加到error.log文件中
cat nonexist.txt 2>> error.log# 將test.txt文件作為wc命令的標準輸入,統計文件的行數、單詞數和字節數
wc < test.txt# 將ps命令的標準輸出作為grep命令的標準輸入,篩選出包含bash的進程
ps | grep bash

文件類型

Linux中的文件可以分為以下幾種類型:

  • 普通文件(regular file):這是最常見的文件類型,它包含了一些數據,可以是文本、二進制、圖片、音頻、視頻等。普通文件的文件名可以是任意的,沒有特定的后綴名。普通文件可以用cat、cp、mv、rm等命令進行操作。
  • 目錄文件(directory file):這是一種特殊的文件,它用來存儲其他文件的信息,包括文件名、大小、類型、權限、時間戳等。目錄文件可以看作是一個文件的集合,它可以包含其他的目錄文件,形成一個層次結構。目錄文件的文件名通常以/結尾,表示它是一個目錄。目錄文件可以用ls、cd、mkdir、rmdir等命令進行操作。
  • 符號鏈接文件(symbolic link file):這是一種特殊的文件,它用來指向另一個文件或目錄,類似于一個快捷方式。符號鏈接文件的文件名通常以@結尾,表示它是一個鏈接。符號鏈接文件可以用ln、readlink等命令進行操作。
  • 設備文件(device file):這是一種特殊的文件,它用來表示一個物理設備,例如硬盤、鍵盤、鼠標、打印機等。設備文件可以分為兩種,一種是字符設備文件(character device file),它表示一個字符流設備,例如鍵盤、鼠標等。另一種是塊設備文件(block device file),它表示一個塊存儲設備,例如硬盤、光驅等。設備文件的文件名通常以c或b開頭,表示它是一個字符設備或塊設備。設備文件可以用lsblk、mount、umount等命令進行操作。
  • 套接字文件(socket file):這是一種特殊的文件,它用來表示一個網絡連接,例如TCP、UDP、UNIX等。套接字文件可以用來實現進程間或機器間的通信。套接字文件的文件名通常以=開頭,表示它是一個套接字。套接字文件可以用netstat、nc、telnet等命令進行操作。
  • 管道文件(pipe file):這是一種特殊的文件,它用來表示一個內存中的緩沖區,可以用來實現進程間的通信。管道文件有兩種,一種是命名管道(named pipe),它有一個文件名,可以被多個進程共享。另一種是匿名管道(anonymous pipe),它沒有文件名,只能被父子進程共享。管道文件的文件名通常以|開頭,表示它是一個管道。管道文件可以用mkfifo、cat、tee等命令進行操作。

文件類型可以用ls -l命令查看,例如:

# 查看當前目錄下的所有文件的類型和權限
ls -l
total 16
drwxr-xr-x 2 user user 4096 Nov 23 00:10 dir/ # 目錄文件
-rw-r--r-- 1 user user   12 Nov 23 00:10 file # 普通文件
lrwxrwxrwx 1 user user    4 Nov 23 00:10 link -> file # 符號鏈接文件
prw-r--r-- 1 user user    0 Nov 23 00:10 pipe| # 管道文件
crw-rw-rw- 1 root root 1, 3 Nov 23 00:10 null # 字符設備文件
brw-rw---- 1 root disk 8, 0 Nov 23 00:10 sda # 塊設備文件
srwxr-xr-x 1 user user    0 Nov 23 00:10 sock= #套接字文件

文件權限

Linux中的每個文件都有一組權限,用來控制對該文件的訪問。文件權限分為三類,分別是用戶權限(user permission)、組權限(group permission)和其他權限(other permission)。每類權限又分為三種,分別是讀權限(read permission)、寫權限(write permission)和執行權限(execute permission)。讀權限表示可以讀取該文件的內容,寫權限表示可以修改該文件的內容,執行權限表示可以運行該文件(如果是可執行文件)。文件權限可以用ls -l、chmod、chown、chgrp等命令進行查看和修改。

文件權限的表示方法有兩種,一種是符號表示法(symbolic notation),它用r、w、x分別表示讀、寫、執行權限,用-表示沒有權限,用u、g、o分別表示用戶、組、其他,用+、-、=分別表示添加、刪除、設置權限。另一種是數字表示法(numeric notation),它用0-7分別表示沒有權限、執行權限、寫權限、寫執行權限、讀權限、讀執行權限、讀寫權限、讀寫執行權限,用三位數字分別表示用戶、組、其他的權限。例如:

# 查看當前目錄下的所有文件的權限
ls -l
total 16
drwxr-xr-x 2 user user 4096 Nov 23 00:10 dir/ # 目錄文件,用戶、組、其他都有讀寫執行權限
-rw-r--r-- 1 user user   12 Nov 23 00:10 file # 普通文件,用戶有讀寫權限,組、其他只有讀權限
lrwxrwxrwx 1 user user    4 Nov 23 00:10 link -> file # 符號鏈接文件,用戶、組、其他都有讀寫執行權限
prw-r--r-- 1 user user    0 Nov 23 00:10 pipe| # 管道文件,用戶有讀寫權限,組、其他只有讀權限
crw-rw-rw- 1 root root 1, 3 Nov 23 00:10 null # 字符設備文件,用戶、組、其他都有讀寫權限
brw-rw---- 1 root disk 8, 0 Nov 23 00:10 sda # 塊設備文件,用戶、組有讀寫權限,其他沒有權限
srwxr-xr-x 1 user user    0 Nov 23 00:10 sock= # 套接字文件,用戶有讀寫執行權限,組、其他只有執行權限# 修改file文件的權限,使用戶、組、其他都有讀寫權限,使用符號表示法
chmod ugo+rw file# 修改dir目錄的權限,使用戶有讀寫執行權限,組有讀執行權限,其他沒有任何權限,使用數字表示法
chmod 740 dir

文件系統

Linux中的文件系統是一種用來組織和管理文件的方式,它定義了文件的存儲、訪問和操作的規則。Linux支持多種文件系統,例如ext2、ext3、ext4、xfs、btrfs、fat、ntfs等。每種文件系統都有自己的特點和優缺點,例如性能、可靠性、兼容性等。文件系統可以用mkfs、fsck、mount、umount等命令進行創建、檢查、掛載和卸載。

文件系統的創建可以用mkfs命令實現,它可以指定文件系統的類型、大小、標簽等參數,例如:

# 創建一個ext4類型的文件系統,大小為1G,標簽為data,分配給/dev/sdb1分區
mkfs -t ext4 -L data -b 1024 /dev/sdb1

文件系統的檢查可以用fsck命令實現,它可以檢測和修復文件系統的錯誤,例如:

# 檢查并修復/dev/sdb1分區的文件系統,使用交互模式,詢問用戶是否修復
fsck -t ext4 -r /dev/sdb1

文件系統的掛載可以用mount命令實現,它可以將一個文件系統關聯到一個目錄,使之可以被訪問,例如:

# 掛載/dev/sdb1分區的文件系統到/mnt/data目錄,使用默認選項
mount /dev/sdb1 /mnt/data

文件系統的卸載可以用umount命令實現,它可以將一個文件系統和一個目錄解除關聯,使之不再被訪問,例如:

# 卸載/mnt/data目錄的文件系統,使用默認選項
umount /mnt/data

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161277.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161277.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161277.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

centos無法進入系統之原因解決辦法集合

前言 可愛的小伙伴們&#xff0c;由于精力有限&#xff0c;暫時整理了兩類。如果沒有你遇到的問題也沒有關系&#xff0c;歡迎底下留言評論或私信&#xff0c;小編看到后第一時間幫助解決 一. Centos 7 LVM xfs文件系統修復 情況1&#xff1a; [sda] Assuming drive cache:…

Bean基本注解開發

Commponent 使用Component注解代替<bean>標簽 <!--注解掃描:掃描指定的基本包及其子包下的類&#xff0c;識別使用了Component注解的文件--><context:component-scan base-package"org.xfy"></context:component-scan> package org.xfy.Dao.…

【Web】preg_match繞過相關例題wp

目錄 ①[FBCTF 2019]rceservice ②[ctfshow]web130 ③[ctfshow]web131 ④[NISACTF 2022]middlerce 簡單回顧一下基礎 參考文章 p牛神文 preg_match繞過總的來講就三塊可利用 數組繞過、PCRE回溯次數限制、換行符 ①[FBCTF 2019]rceservice 先貼出附件給的源碼 &l…

使用electron工具打包web端到PC端應用程序

根據electron官網快速入門示例可以方便的構建mac端包&#xff0c;我們在此基礎上構建windows端exe包. 1在package.json文件的script字段增加以下配置 "scripts": {..."build": "electron-builder --win"}, 2然后在終端執行以下命令 npm run b…

Modbus TCP

Modbus &#xff08;&#x1f446; 百度百科&#xff0c;放心跳轉&#xff09; 起源 Modbus 由 Modicon 公司于 1979 年開發&#xff0c;是一種工業現場總線協議標準。 Modbus 通信協議具有多個變種&#xff0c;支持串口&#xff0c;以太網多個版本&#xff0c;其中最著名的…

基于STM32的數字圖像處理與模式識別算法優化

基于STM32的數字圖像處理與模式識別算法優化是一項涉及圖像處理和機器學習領域的研究任務&#xff0c;旨在實現高效的圖像處理和模式識別算法在STM32微控制器上的運行。本文將介紹基于STM32的數字圖像處理與模式識別算法優化的原理和實現步驟&#xff0c;并提供相應的代碼示例。…

圖神經網絡與圖注意力網絡

隨著計算機行業和互聯網時代的不斷發展與進步&#xff0c;圖神經網絡已經成為人工智能和大數據的重要研究領域。圖神經網絡是對相鄰節點間信息的傳播和聚合的重要技術&#xff0c;可以有效地將深度學習的理念應用于非歐幾里德空間的數據上。本期推送圍繞圖神經網絡與圖注意力網…

dockerfile多階段構建

我理解多階段構建 多階段構建就是為了鏡像更小更容易維護&#xff0c;易讀&#xff0c;最終從一個階段的核心內容復制到另一個階段&#xff0c;而不必需要那些非核心的內容。 舉例說明 FROM registry.cn-hangzhou.aliyuncs.com/2qqq/node:14 as build COPY ./app WORKDIR /app…

RK3588平臺開發系列講解(嵌入式AI篇)嵌入式AI模型的部署

文章目錄 一、嵌入式AI模型的部署二、AI模型訓練框架有哪些三、rknn-toolkit可支持轉換的模型沉淀、分享、成長,讓自己和他人都能有所收獲!?? ?? 本篇將給大家介紹嵌入式AI模型的部署。 一、嵌入式AI模型的部署 模型的部署,是指將訓練好的模型放到運行環境中進行推理的…

【11月比賽合集】48場可報名的數據挖掘大獎賽,任君挑選!

CompHub[1] 實時聚合多平臺的數據類(Kaggle、天池…)和OJ類(Leetcode、牛客…&#xff09;比賽。本賬號會推送最新的比賽消息&#xff0c;歡迎關注&#xff01; 以下信息僅供參考&#xff0c;以比賽官網為準 目錄 Kaggle&#xff08;9場比賽&#xff09;阿里天池&#xff08;…

PHP curl常見CURLESSLCACERT (60)錯誤及get,post實例

常見的 CURLE_SSL_CACERT (60) 錯誤&#xff0c; 解決辦法&#xff1a; 從 https://curl.haxx.se/ca/cacert.pem (opens new window)下載最新的 可直接下載2022 年 3 月 22 日 配置 php.ini 文件&#xff0c;搜索 [curl] &#xff0c;在下方添加 curl.cainfo "D:\php…

HarmonyOS(三)—— 應用程序入口—UIAbility

前言 學習過android的同學都是知道Activity&#xff0c;Activity是Android組件中最基本也是最為常見用的四大組件之一&#xff0c;用戶可以用來交互為了完成某項任務。 Activity中所有操作都與用戶密切相關&#xff0c;是一個負責與用戶交互的組件&#xff0c;可以通過setCon…

10個容易被忽視的FastAPI實用功能

大家好&#xff0c;FastAPI是一種現代、高性能的Python Web框架&#xff0c;用于構建Web應用程序和API。它基于Python的異步編程庫asyncio和await語法&#xff0c;以及類型注解和自動文檔生成等特性&#xff0c;提供了快速、易用和可靠的開發體驗&#xff0c;接下來本文將介紹1…

ElasticSearch之Nodes info API

查看當前集群中各節點的信息&#xff0c;執行如下命令&#xff1a; curl -X GET "https://localhost:9200/_nodes?pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9"本接口允許指定節點和指標。 當前支持的指標&#…

機器視覺公司為什么寧愿高薪招新人,也不愿加薪留老員工?老員工特殊時間特殊照顧,新人必須常照顧

?職場常出現的“薪酬倒掛”現象。其實這是正常的職場規律&#xff0c;實際上是企業管理不得不面對的一種選擇。 很多企業寧愿老員工離職也不加薪&#xff0c;卻高薪請新員工&#xff1f;這就是職場上的鯰魚效應&#xff0c;一些高層領導認為一個企業&#xff0c;老員工好比沙…

基本的彈層,點擊彈出

<div class"role"><el-button type"primary" size"mini" click"showDialog true">添加角色</el-button></div><!--控制彈框的顯示隱藏visible .sync可以點擊X關閉彈框 --> <el-dialog width"…

Spring Cloud學習(十一)【深入Elasticsearch 分布式搜索引擎03】

文章目錄 數據聚合聚合的種類DSL實現聚合RestAPI實現聚合 自動補全拼音分詞器自定義分詞器自動補全查詢completion suggester查詢RestAPI實現自動補全 數據同步數據同步思路分析實現elasticsearch與數據庫數據同步 集群搭建ES集群創建es集群集群狀態監控創建索引庫1&#xff09…

【RocketMq系列-02】RocketMq的架構解析和高性能設計

RocketMq系列整體欄目 內容鏈接地址【一】RocketMq安裝和基本概念https://zhenghuisheng.blog.csdn.net/article/details/134486709【二】RocketMq的架構解析和高性能設計/font>https://zhenghuisheng.blog.csdn.net/article/details/134559514 RocketMq的架構解析和高性能設…

CentOS 防火墻查看已開發的端口

在CentOS上&#xff0c;你可以使用 firewall-cmd 命令來查詢當前防火墻規則&#xff0c;以查看已經開放的端口。以下是一些常見的查詢命令&#xff1a; 查詢已開啟的端口&#xff1a; sudo firewall-cmd --list-ports這將列出所有已經開啟的端口。 查詢已開啟的服務&#xf…

leetcode:520. 檢測大寫字母

一、題目&#xff1a; 鏈接&#xff1a;520. 檢測大寫字母 - 力扣&#xff08;LeetCode&#xff09; 函數原型&#xff1a;bool detectCapitalUse(char* word) 二、思路&#xff1a; 本題較為簡單&#xff0c;分為三種情況&#xff1a; 1.首字母大寫&#xff0c;其余小寫 2.首字…