基礎I/O:文件系統調用接口

文章目錄

  • 文件系統調用接口
    • open
    • 系統調用接口和C語言封裝
    • 文件描述符fd
    • 重定向

文件系統調用接口

open

NAME//打開、創建 - 打開并可能創建文件或設備open, creat - open and possibly create a file or deviceSYNOPSIS#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);int creat(const char *pathname, mode_t mode);
給定一個文件路徑,open返回一個文件描述符,一個小的非負整數,用于后續的系統調用。成功調用返回的文件描述符將是當前未為進程打開的編號最低的文件描述符。

flags
參數標志必須包括以下訪問結點之一:O_RDONLY、O_WRONLY、O_RDWR.著三種方式分別表示只讀、只讀或讀/寫文件。

  • O_APPEND
    文件以追加的模式打開。每次寫入之前,文件偏移量位于文件的末尾。
  • O_CREAT
    如果文件不存在,則創建它。將文件的所有者,設置為進程的有效用戶ID。組所屬者設置為進程的有效組ID,也可以設置為父目錄的組ID。
  • mode參數,模式指定在創建新文件時要使用的權限。當在flags中指定使用O_CREAT時,必須提供此參數,如果未使用O_CREAT,則忽略mode。
    有效的權限由進程的umask按照通常的方式修改。

系統調用接口和C語言封裝

  1. 以寫的方式打開,如果文件不存在則創建
fopen("log1.txt",w);
open("log1.txt", O_WRONLY|O_CREAT|O_TRUNC,0666)
  1. 以追加的方式打開,如果文件不存在則創建
fopen("log1.txt",a);
open("log1.txt",O_WRONLY|O_APPEND|O_CREAT,0666);

庫函數:類似fopenfclosefwritefread都是C標準庫中的函數,庫函數
系統調用接口:類似openclosewriteread都屬于系統提供的接口,系統調用接口
C語言庫函數中的f*系列的函數,都是對系統調用的二次封裝,方便二次開發。

在操作系統提供了類似open這種調用接口的情況下,C語言仍然對其進行了封裝,主要原因是為了保證程序的可移植性和跨平臺性。

文件描述符fd

  • Linux進程默認情況下會有3個缺省打開的文件描述符,分別是標準輸入0,標準輸出1,標準錯誤2.
  • 0、1、2對應的物理設備一般是:鍵盤、顯示器、顯示器

    每個打開文件,在內核當中都有file對象那個,保存了文件相關的inode元信息。
    文件描述符的本質就是數組的下標。
    文件描述符就是從0開始的小整數。
    當我們打開文件時操作系統在內存中要創建相應的數據結構來描述目標文件。于是就有了file結構體,表示一個已經打開的文件對象。而進程執行open系統調用,所以必須讓進程和文件關聯起來。每個進程都有一個指針*files,指向一張表file_struct,該表最重要的部分就是包含一個指針數組,每個元素都是一個指向打開文件的指針!所以,本質上,文件描述符就是該數組的小標。所以,只要拿著文件描述符,就可以找到對應的文件。

文件描述符分配規則
在files_struct數組當中,找到當前沒有被使用的最小的一個下標,做為新打開的文件描述符。

重定向

Linux下一切皆文件

對于每一種硬件,操作系統都有對應的系統調用接口

close(1);
const char* buffer = "hello open";
int fd2 = open("log2.txt",O_WRONLY|O_APPEND|O_CREAT,0666);
printf("hello open\n"); 

上段代碼,在執行之后,預期是在顯示器上輸出hello open,但是實際上不是。

在實際的運行之后,本應該打印在顯示器上的數據,卻寫入到了log2.txt文件中。

現象解釋:

  • 當程序執行close(1)之后,文件描述符數組中的1號下標位置,本應指向的stdout文件(標準輸出文件)被關閉,此時文件描述符數組中下標最小的是1號下標。
  • 執行到open語句的時候,需要打開當前目錄下的log2.txt文件,但是不存在,所以此時創建一個新的文件,這個新的文件,在files_struct數組當中,找到當前沒有被使用的最小的一個下標,做為新打開的文件描述符。所以此時log2.txt文件的fd就是1.
  • 對于printf函數,此函數默認將數據寫入到stdout標準輸出流文件中,也就是文件描述符的1號下標處。但是此時1號下標已經指向了新打開的文件,所以數據寫入到了log2.txt文件中。

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

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

相關文章

【C++算法】隊列相關經典算法題

1. N叉樹的層序遍歷 首先我們遇到這個題目&#xff0c;沒有任何思路&#xff0c;我們就可以來模擬一下層序的流程&#xff0c;首先我們肯定是訪問根節點1&#xff0c;訪問之后呢就是訪問下一層的最左節點3&#xff0c;此時第一層的節點1已經訪問過了就可以不要了&#xff0c;然…

[GESP樣題 四級] 填幻方和幸運數

B3940 [GESP樣題 四級] 填幻方 題目 在一個NN 的正方形網格中&#xff0c;每個格子分別填上從 1 到 NN 的正整數&#xff0c;使得正方形中任一行、任一列及對角線的幾個數之和都相等&#xff0c;則這種正方形圖案就稱為“幻方”&#xff08;輸出樣例中展示了一個33 的幻方&am…

ICode國際青少年編程競賽- Python-4級訓練場-嵌套for循環練習

ICode國際青少年編程競賽- Python-4級訓練場-嵌套for循環練習 1、 for i in range(3):Spaceship.step(4)for j in range(4):Dev.step(2)Dev.turnRight()Spaceship.turnLeft()Spaceship.step(4)Spaceship.turnRight()2、 for i in range(4):Spaceship.step(6)for j in range(3):…

Nginx或Tengine服務器配置SSL證書

目錄 前提條件 步驟一&#xff1a;下載SSL證書 步驟二&#xff1a;在Nginx服務器安裝證書 步驟三&#xff1a;驗證SSL證書是否配置成功 前提條件 已通過數字證書管理服務控制臺簽發證書SSL證書綁定的域名已完成DNS解析&#xff0c;即您的域名與主機IP地址相互映射已在Web服…

維修Philips IU22飛利浦四維多普勒彩超診斷儀 V6-2 L12-5 C8-4V深圳捷達工控維修

專為新時代而設計。專為更多而設計。 超聲波在抗擊 COVID-19 中的成像作用不斷擴大&#xff0c;并且對血管和心臟檢查的需求不斷增加&#xff0c;因此比以往任何時候都更有價值。飛利浦的超聲產品組合&#xff08;包括 EPIQ Elite&#xff09;為一線護理人員提供了寶貴的診斷支…

Intel處理器7z/XZ遇到 The failure in hardware

最近在使用Intel 12700H混合架構處理器的時候&#xff0c;一旦使用7z或者XZ算法壓縮東西就會出現如下的報錯&#xff1a; Internal Error: The failure in hardware (RAM or CPU), OS or program在檢查排除了內存、磁盤和OS的問題后&#xff0c;最終確定為Intel CPU的問題&…

Lazada、Shopee測評自養號,快速出單技巧全解析!

每個人都憧憬著自己的店鋪能夠擁有一款或多款引人注目的熱銷商品&#xff0c;這些商品不僅能為店鋪帶來可觀的收益&#xff0c;更重要的是它們能夠成為吸引顧客的強大磁石&#xff0c;顯著提升店鋪的整體流量。一旦這樣的爆款商品成功吸引顧客&#xff0c;其他產品也將隨之受到…

C++11:并發新紀元 —— 深入理解異步編程的力量(1)

hello &#xff01;大家好呀&#xff01; 歡迎大家來到我的Linux高性能服務器編程系列之《C11&#xff1a;并發新紀元 —— 深入理解異步編程的力量》&#xff0c;在這篇文章中&#xff0c;你將會學習到C新特性以及異步編程的好處&#xff0c;以及其如何帶來的高性能的魅力&…

Python:通過接口獲取公眾號的文章列表(但是開發文檔沒有這個接口)

&#x1f4da;博客主頁&#xff1a;knighthood2001 ?公眾號&#xff1a;認知up吧 &#xff08;目前正在帶領大家一起提升認知&#xff0c;感興趣可以來圍觀一下&#xff09; &#x1f383;知識星球&#xff1a;【認知up吧|成長|副業】介紹 ??感謝大家點贊&#x1f44d;&…

【LeetCode】每日一題:2960. 統計已測試設備

給你一個長度為 n 、下標從 0 開始的整數數組 batteryPercentages &#xff0c;表示 n 個設備的電池百分比。 你的任務是按照順序測試每個設備 i&#xff0c;執行以下測試操作&#xff1a; 如果 batteryPercentages[i] 大于 0&#xff1a; 增加 已測試設備的計數。 將下標在 [i…

力扣HOT100 - 35. 搜索插入位置

解題思路&#xff1a; 二分法模板 class Solution {public int searchInsert(int[] nums, int target) {int left 0;int right nums.length - 1;while (left < right) {int mid left ((right - left) >> 1);if (nums[mid] target)return mid;else if (nums[mid…

【qt】設計器實現界面

設計器實現界面 一.總體思路二.具體操作1.創建項目2.粗略拖放3.水平布局4.垂直布局5.修改名字6.轉到槽7.實現槽函數 一.總體思路 二.具體操作 1.創建項目 這次咱們一定要勾選Generate form哦。 因為我們要使用設計器進行拖放。 2.粗略拖放 這里用到了復選框&#xff1a;C…

[數據集][目標檢測]管道焊縫質量檢測數據集VOC+YOLO格式1134張2類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;1134 標注數量(xml文件個數)&#xff1a;1134 標注數量(txt文件個數)&#xff1a;1134 標注…

python元類與C#、Java中的反射

Python的元類和C#中的反射 在概念上有一定的相似性&#xff0c;但它們的目的和使用方式有所不同。 Python的元類&#xff1a; 元類&#xff08;Metaclass&#xff09;是控制類創建的類。它們定義了類的創建過程&#xff0c;可以修改類的行為。元類通過定制類的創建過程&…

算法訓練營第二十五天 | LeetCode 669 修剪二叉樹、

LeetCode 669 修剪二叉樹 這題用層序遍歷雙指針刪除不符合條件的節點即可。具體是要用到一個虛擬根節點&#xff0c;雙指針中prev指針每次指向隊列頂元素&#xff0c;cur指針先指向prev左子節點&#xff0c;用循環去除這個位置上不符合條件的節點并連上繼承節點&#xff0c;內…

“我們堅持開源!”阿里云發布“地表最強”中文大模型:半年一迭代、性能翻倍?

5 月 9 日&#xff0c;在通義大模型發布一周年之際&#xff0c;阿里云大模型生態迎來一次重大升級&#xff0c;主要有“四個最”&#xff1a; 通義千問 2.5 正式發布&#xff0c;“模型性能全面趕超 GPT-4 Turbo&#xff0c;成為地表最強中文大模型”&#xff1b;Qwen1.5-110B…

卷積特征圖與感受野

特征圖尺寸和感受野是卷積神經網絡中非常重要的兩個概念&#xff0c;今天來看一下&#xff0c;如何計算特征尺寸和感受野。 特征圖尺寸 卷積特征圖&#xff0c;是圖片經過卷積核處理之后的尺寸。計算輸出特征的尺寸&#xff0c;需要給出卷積核的相關參數包括&#xff1a; 輸…

PC端與bluetooth藍牙虛擬串口通信

應該采用RFCOMM虛擬串口方式來進行通信&#xff0c;原理跟socket通信類似&#xff0c;不同的是使用的通信協議不同&#xff0c;本人結合相關的API&#xff0c;做了以下最簡單的封裝。 1、獲取本地藍牙設備與附近藍牙設備信息 2、通信類 /* 通信類&#xff1a;只是對于客戶端通…

基于Python實現單例模式

目錄 1、使用裝飾器實現 2、使用__new__方法實現 單例模式是一種設計模式&#xff0c;它確保一個類只有一個實例&#xff0c;并提供一個全局訪問點來訪問這個唯一實例。這種模式在多種場景中都非常有用&#xff0c;以下是單例模式的一些常見應用場景&#xff1a; 應用程序的…

Spring線程池有哪些

目錄 SimpleAsyncTaskExecutor SyncTaskExecutor ThreadPoolTaskExecutor ThreadPoolTaskScheduler Spring框架提供了多種線程池類型,以滿足不同場景下的需求。以下是一些常見的Spring線程池類型: SimpleAsyncTaskExecutor 這個實現不重用任何線程,每次調用都會啟動一…