《UNIXLinux程序設計教程》一2.1 UNIX 輸入輸出基本概念

2.1 UNIX 輸入輸出基本概念

在任何一種操作系統中,程序開始讀寫一個文件的內容之前,必須首先在程序與文件之間建立連接或通信通道,這一過程稱為打開文件。打開一個文件的目的可能是要讀其中的數據,也可能是要往其中寫入數據,還可能是既要讀又要寫數據。
UNIX系統有兩種機制用于描述程序與文件的這種連接:一種稱為文件描述字,另一種稱為流。因此,系統中關于I/O的函數也分為兩大類:一類針對文件描述字操作,另一類針對流操作。
當用流或描述字I/O函數打開一個文件時,它們分別返回一個流或文件描述字,然后便可以將這個流或文件描述字作為參數傳遞給相應讀寫函數來完成實際的讀寫操作。
當已完成對文件的讀寫之后,可以通過關閉文件而終止程序與文件的這種連接。一旦關閉了一個文件描述字或者一個流,就不能再對它進行輸入輸出。

  1. 文件描述字與流
    UNIX系統中,文件描述字表示為int類型的對象,而流表示為指向類型為FILE結構的指針。文件描述字函數多數是系統調用,它們提供底層基本的輸入輸出操作接口。當需要對特定設備進行控制操作時,往往必須使用文件描述字,流函數不能夠進行這類操作。另外,如果程序需要按特殊方式進行輸入輸出(如非阻塞輸入),也必須使用文件描述字。

流函數建立在文件描述字之上,通過文件描述字函數而實現,它給程序提供了更高一級的輸入輸出接口。流函數比對應的文件描述字函數更豐富,功能更強大,也更利于程序的移植。任何運行ANSI C的系統均支持流,但并不是所有系統都支持文件描述字,有的系統根本不支持文件描述字或僅僅實現了文件描述字函數集合的一個子集。因此,一般情況下,應當堅持使用流而不是文件描述字,除非是想做某種特殊操作,而此操作只能用文件描述字才能完成。
本章將介紹的標準I/O函數均針對流操作,第3章將介紹針對文件描述字的I/O函數。

  1. 文件名與路徑名
    UNIX系統中幾乎每一種對象都表示為文件,不僅是通常的數據集合,系統中的每一個設備也表示為文件。文件被安排在目錄中,目錄本身又含有子目錄,由此形成了文件系統的層次結構。

目錄本身也是一種文件,不過它的內容是一組連接實際文件的文件名及相關信息,這些連接稱為鏈或目錄登記項(4.2.2節)。我們前面雖然說 “文件被安排在目錄中”,但是實際上目錄只包含指向文件的指針而不是文件本身。為了理解文件名的語法,首先需要理解UNIX文件系統的目錄層次結構。
系統中,每一個用戶均有一個主目錄,其文件通常存儲在這個目錄以及該目錄的子目錄中。例如,用戶kjzhao,他的主目錄是/home/kjzhao,在其主目錄中有系統幫助建立的幾個標準目錄,如.bash_profile等;也有由他自己創建的子目錄,如用于日常工作的目錄work,用于應用程序的目錄program等。另外一些用戶的主目錄也可能位于/home目錄中,而/home則是根目錄“/”的子目錄。在根目錄中通常還包括用于系統程序的子目錄/bin,用于系統配置文件的子目錄/etc,用于系統庫文件的子目錄/lib,以及代表各種物理設備的子目錄/dev等。圖2-1是這種目錄層次的一個示例圖。
UNIX中,當涉及一個文件的名字時,常常使用術語“文件名”或“路徑名”。但按POSIX標準術語,文件名和路徑名分別有不同的含義:文件名指的是不帶路徑的文件名,而路徑名的含義則較廣泛,它既包括含路徑的文件名,也包括單個文件名。不過,從一般用戶的角度來看,由于路徑名總是用來引用文件,因此有時也不加區分地統稱路徑名為文件名。為了敘述方便,本節我們按POSIX標準區分路徑名和文件名。在其他章節中,只要上下文含義清楚,我們也不加區分地使用路徑名和文件名。
同其他操作系統一樣,UNIX中每一個文件都有一個名字,此名字為一字符串,即文件名。文件名用于命名一個文件,它由1至NAME_MAX個字符組成,這些字符可以是字符集中除斜線字符(/)和空字符(NUL)之外的任意字符。系統宏NAME_MAX是POSIX定義的文件名的最大字符個數(不是字符串的長度,該計數不包括結束的空字符)。文件名也稱為路徑名分量。
路徑名用于標識一個文件,它是由1至PATH_MAX個字符組成的字符串。路徑名由用斜線“/”分隔的一至多個路徑名分量構成的序列組成。路徑名開始的斜線是可選的,僅由一個分量構成的路徑名標識一個相對于當前目錄的文件,多個連續的“/”字符等價于單個“/”字符。一個具有多個路徑名分量的路徑名命名一個目錄以及在該目錄中的文件。系統宏PATH_MAX是POSIX定義的路徑名的最大字符個數,大多數現代UNIX版本中該值定為1024, Linux則沒有限制。
以“/”開頭的路徑名稱為絕對路徑名,此路徑名的第一個分量位于根目錄;其他路徑名稱為相對路徑名,它們的第一個分量位于當前工作目錄(4.9.1節)。

b416ca96299e9a6840a63b380351d923c5e51854

路徑名分量“.”和“..”有特殊的含義。“.”表示當前目錄,“..”表示當前目錄的父目錄。作為一個例外,根目錄中的“..”表示的是根目錄本身。
標識一個目錄的路徑名可以任選地以斜線“/”結尾。可用路徑名“/”來引用根目錄。下面是一些路徑名的例子:
/a/b 根目錄下子目錄a中的文件b
a 當前工作目錄中名為a的文件
./a 與a相同
../a 當前工作目錄的父目錄中名為a的文件
與Windows操作系統不同,UNIX沒有任何關于文件擴展名或文件版本的內建支持作為文件名語法的一部分。雖然許多實用程序使用有關文件名的一些約定,如C源代碼文件通常具有后綴為“.c”的名字,但是,這并不意味著UNIX文件系統本身強制這類約定。

  1. 文件位置
    對于已打開的文件,它的屬性之一是文件位置。文件位置給出文件中當前可讀寫字符的位置,在所有POSIX兼容的系統中,它是一個表示距文件開始多少字節數的整數。

當文件剛打開時,文件位置位于文件的開始處,之后每當讀出或者寫入一個字符,文件的位置便增加一字節。換言之,對文件的訪問是順序的。
但是,對于以“添加”(append)打開的文件(2.3節),其寫出的處理有點特殊。對這種文件的寫出總是順序地附加在該文件的末尾,而不管文件的位置如何。其文件位置只用于控制從文件讀出數據。
普通文件(4.2.1節)允許讀寫文件的任意位置。這種允許讀寫任意位置的文件也稱為隨機文件。可以用函數fseek()或lseek()改變隨機文件的位置。如果企圖改變一個不支持隨機訪問的文件的位置,則會得到ESPIPE錯誤。磁盤文件一般均是隨機文件,終端則不是隨機文件。
UNIX環境中,多個進程可同時讀一個文件。為了使得每個進程都能夠按自己的步調讀文件,每個進程必須有自己的文件位置指針,這樣才不會受到其他進程的影響。事實上,進程每次打開一個文件都會創建一個獨立的文件位置。因此,即使在同一個程序中打開一個文件兩次,也會得到兩個具有獨立文件位置的流或描述字。但是,如果打開一個文件描述字,然后復制它得到另一個文件描述字(3.5節),則這兩個文件描述字會共享同一文件位置:改變一個文件描述字的文件位置將影響另一個描述字的文件位置。

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

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

相關文章

python時間計算_日期天數差計算(Python)

描述 從json文件中讀取兩個時間數據(數據格式例如:2019.01.01,數據類型是字符串),并計算結果,打印出兩個時間間隔了多少天。 輸入/輸出描述 輸入描述 json文件名稱datetime.json,格式如下&#…

c語言編常見算法,5個常見C語言算法

5個常見C語言算法十進制轉換為二進制的遞歸程序字符串逆置的遞歸程序整數數位反序&#xff0c;例如12345->54321四舍五入程序(考慮正負數)二分法查找的遞歸函數#include#include#include//十進制轉換為二進制的遞歸程序voidDecimalToBinary(int n){if(n<0){printf("…

利用Kinect將投影變得可直接用手操控

Finally 總算是到了這一天了&#xff01;假期里算法想不出來&#xff0c;或者被BUG折磨得死去活來的時候&#xff0c;總是YY著什么時候能心情愉快地坐在電腦前寫一篇項目總結&#xff0c;今天總算是抽出時間來總結一下這神奇的幾個月。 現在回過頭來看&#xff0c;上學期退出AC…

my-medium.cnf_您的手機如何打開medium.com-我將讓門衛和圖書管理員解釋。

my-medium.cnfby Andrea Zanin由Andrea Zanin 您的手機如何打開medium.com-我將讓門衛和圖書管理員解釋。 (How your phone opens medium.com — I’ll let a doorman and a librarian explain.) Hey did you notice what just happened? You clicked a link, and now here y…

springboot自動配置的原理_SpringBoot自動配置原理

SpringBoot的啟動入口就是一個非常簡單的run方法&#xff0c;這個run方法會加載一個應用所需要的所有資源和配置&#xff0c;最后啟動應用。通過查看run方法的源碼&#xff0c;我們發現&#xff0c;run方法首先啟動了一個監聽器&#xff0c;然后創建了一個應用上下文Configurab…

Django first lesson 環境搭建

pycharm ide集成開發環境 &#xff08;提高開發效率&#xff09; 解釋器/編譯器編輯器調試環境虛擬機連接 設置VirtualBox端口 操作1 操作2 點擊號添加&#xff0c;名稱為SSH&#xff0c;其中主機端口為物理機的端口&#xff0c;這里設置為1234&#xff0c;子系統端口為虛擬機的…

《Drupal實戰》——3.3 使用Views創建列表

3.3 使用Views創建列表 我們接著講解Views的設置&#xff0c;首先做一個簡單的實例。 3.3.1 添加內容類型“站內公告” 添加一個內容類型“站內公告”&#xff0c;屬性配置如表3-1所示。 為該內容類型設置Pathauto的模式news/[node:nid]&#xff0c;并且我們在這里將節點類型…

c語言函數編正切余切運算,淺談正切函數與余切函數的應用

九年義務教育三年制初級中學“數學”課本中&#xff0c;對正切函數和余切函數的定義是這樣下的&#xff1a;在&#xff32;&#xff54;&#xff21;&#xff22;&#xff23;中&#xff0c;∠&#xff23;&#xff1d;&#xff19;&#xff10;&#xff0c;&#xff41;&#…

wget命令下載文件

wget -r -N -l -k http://192.168.99.81:8000/solrhome/ 命令格式&#xff1a; wget [參數列表] [目標軟件、網頁的網址] -V,–version 顯示軟件版本號然后退出&#xff1b; -h,–help顯示軟件幫助信息&#xff1b; -e,–executeCOMMAND 執行一個 “.wgetrc”命令 -o,–output…

idea mybatis generator插件_SpringBoot+MyBatis+Druid整合demo

最近自己寫了一個SpringBootMybatis(generator)druid的demo1. mybatisgenerator逆向工程生成代碼1. pom文件pom文件添加如下內容&#xff0c;引入generator插件org.mybatis.generator mybatis-generator-maven-plugin 1.3.5 mysql …

vr格式視頻價格_如何以100美元的價格打造自己的VR耳機

vr格式視頻價格by Maxime Coutte馬克西姆庫特(Maxime Coutte) 如何以100美元的價格打造自己的VR耳機 (How you can build your own VR headset for $100) My name is Maxime Peroumal. I’m 16 and I built my own VR headset with my best friends, Jonas Ceccon and Gabriel…

python_裝飾器

# 裝飾器形成的過程 : 最簡單的裝飾器 有返回值得 有一個參數 萬能參數# 裝飾器的作用# 原則 &#xff1a;開放封閉原則# 語法糖&#xff1a;裝飾函數名# 裝飾器的固定模式 import time # time.time() # 獲取當前時間 # time.sleep() # 等待 # 裝飾帶參數的裝飾器 def timer…

歐洲的數據中心與美國的數據中心如何區分?

人會想到這意味著&#xff0c;在歐洲和北美的數據中心的設計基本上不會有大的差異。不過&#xff0c;一些小的差異是確實存在的。您可能想知道為什么你需要了解歐洲和北美的數據中心之間的差異&#xff0c;這對你的公司有幫助嗎?一個設計團隊往往能從另一個設計團隊那里學到東…

老農過河

java老農過河問題解決 http://www.52pojie.cn/thread-550328-1-1.html http://bbs.itheima.com/thread-141470-1-1.html http://touch-2011.iteye.com/blog/1104628 轉載于:https://www.cnblogs.com/wangjunwei/p/6032602.html

python isalnum函數_探究Python中isalnum()方法的使用

探究Python中isalnum()方法的使用 isalnum()方法檢查判斷字符串是否包含字母數字字符。 語法 以下是isalnum()方法的語法&#xff1a; str.isa1num() 參數 NA 返回值 如果字符串中的所有字符字母數字和至少有一個字符此方法返回 true&#xff0c;否則返回false。 例子 下面的例…

docker快速入門_Docker標簽快速入門

docker快速入門by Shubheksha通過Shubheksha Docker標簽快速入門 (A quick introduction to Docker tags) If you’ve worked with Docker even for a little while, I bet you’ve come across tags. They often look like “my_image_name:1” where the part after the col…

動態規劃算法——最長上升子序列

今天我們要講的是最長上升子序列&#xff08;LIS&#xff09;。【題目描述】給定N個數&#xff0c;求這N個數的最長上升子序列的長度。【樣例輸入】      【樣例輸出】7        42 5 3 4 1 7 6那么什么是最長上升子序列呢&#xff1f; 就是給你一個序列…

如何快速掌握一門新技術/語言/框架

IT行業中的企業特點是都屬于知識密集型企業。這種企業的核心競爭力與員工的知識和技能密切相關。而如果你在企業中扮演的是工程師的角色的話&#xff0c;那么 你的核心競爭力就是IT相關的知識與技能的儲備情況。而眾所周知&#xff0c;IT行業是一個大量產生新知識的地方&#x…

c語言今天星期幾問題,C語言輸入今天星期幾

滿意答案迷茫03222015.07.24采納率&#xff1a;55% 等級&#xff1a;9已幫助&#xff1a;665人123456789101112131415161718192021#include<stdio.h>int main(void){ enum weekday{ sun, mon, tue, wed, thu, fri, sat }; int n; printf("輸入星期數(0-…

備忘錄模式 詳解

定義 在不破壞封裝性的前提下&#xff0c;捕獲一個對象的內部狀態&#xff0c;并在該對象之外保存這個狀態&#xff1b; 行為型模式 角色 發起人角色&#xff08;Originator&#xff09;&#xff1a;記錄當前時刻的內部狀態&#xff0c;負責定義哪些屬于備份范圍的狀態&#xf…