亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Unix > 正文

UNIX高級環境編程(1)File I/O

2024-06-28 13:21:59
字體:
來源:轉載
供稿:網友
UNIX高級環境編程(1)File I/O引言:

Unix系統中主要的文件操作包括:

  • open
  • read
  • write
  • lseek
  • close

unbuffered IO和standard I/O相對應,后面的章節我們會討論這兩者的區別。

在討論open函數的時候,會引入原子操作,多進程通信(共享文件描述符)和內核相關的數據結構。

一,文件描述符

對應內核來說,每一個打開的文件都對應一個非負整數。

有三個特殊的文件描述符:

  • 0表示標準輸入
  • 1表示標準輸出
  • 2表示標準錯誤輸出

對于較新的內核來說(linux3.2.0,Solaris10等),文件描述符的數量并沒有明確的限制,受限于內存的大小。

二,常用的幾個文件操作函數

常用的文件操作函數包括:open,read,write,lseek,close

1 open和openat函數

函數聲明:

#include <fcntl.h>int open (const char *path, int oflag, … /* mode_t mode */);int openat (int fd, const char *path, int oflag, … /* mode_t mode */);

返回值:

OK:文件描述符(非負整數)

Error:-1

注:參數列表中,“...”表示不同的系統和標準中,該處的參數可能不相同。

參數說明:

path:文件名

oflag:打開創建文件的屬性。

下面有五個必選的oflag參數值,這五個值有切只能選一個。另外還有若干個可選參數值,可以自行百度。

NewImage

細節說明:

由open和openat返回的文件描述符保證為未使用的最小的文件描述。有的應用利用這一特性,先關閉標準輸入描述符0,就可以在標準輸入描述0上打開文件。

參數fd可以區分open和openat函數。其取值有三種可能:

  1. path表示一個絕對路徑,則fd參數無用,openat的功能和open相同;
  2. path表示一個相對路徑,則fd是一個文件描述符,指定了path在文件系統中的起始位置,fd為打開path父目錄時獲取的文件描述符;
  3. path表示一個相對路徑,而fd的值為AT_FDCWD,這時,path的父目錄為當前工作目錄,openat和open的功能相同。

openat函數解決了兩個問題:

  • 在多線程條件下,默認各個線程的工作目錄時相同的(當前工作目錄),使用這個函數可以使得各個線程的指定不同的工作目錄;
  • 提供了一種方法解決TOCTTOU(time-of-check-to-time-of-use) error。

這里介紹一下TOCTTOU錯誤。該類錯誤指的是,程序是非常脆弱的(vulnerable)如果該程序調用了兩個文件相關的函數,第二個函數依賴于第一個函數的結果。因為兩個函數是非原子操作,被操作的文件可能被兩個函數輪流操作(線程切換),導致第一個函數的結果出錯,從而程序出錯。

2 creat函數

函數聲明:

#include <fcntl.h>int creat(const char* path, mode_t mode);

返回值:

  • OK:文件描述符(只寫)
  • Error:-1

creat函數相當于下面這樣調用open函數

open (path, O_WEONLY | O_CREAT | O_TRUNC, mode);

creat有一點不方便,因為它打開的文件描述符是只讀的,如果希望寫入之后讀回,需要依次調用creat、close和open,才能實現。

因此,在這種場景下,一個更好的打開文件的方法是像下面這樣調用open函數:

open (path, O_RDWR | O_CREAT | O_TRUNC, mode);

3 close函數

函數聲明:

#include <unistd.h>int close(int fd);

返回值:

  • 0 :OK
  • -1:Error

關閉一個文件會釋放所有當前進程加在該文件上的記錄鎖。

4 lseek函數

每一個打開的文件都有一個”當前文件偏移量(current file offset)“,該偏移量是一個非負整數,記錄了從文件開始到當前位置的字節數。

函數聲明:

#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);

參數說明:

offset的作用取決于參數whence的值:

  • 如果whence的值是SEEK_SET,文件的偏移量設置為offset個字節;
  • 如果whence的值是SEEK_CUR,文件的偏移量設置為當前偏移量加上參數offset的值;
  • 如果whence的值是SEEK_END,文件的偏移量設置為文件長度加上參數offset的值,offset可以是正值或負值。

細節說明:

獲取當前文件偏移量的方法:

1 off_t currpos;2 3 currpos = lseek(fd, 0, SEEK_CUR);

lseek只記錄當前文件在內核中的偏移量,并不會引起任何的IO操作。返回的offset將會在后面的read或write函數中使用。

偏移量可以比當前文件的長度大,這時,再調用write函數時,將擴展該文件的長度。這樣的操作相當于在文件中建了一個洞,該洞范圍內讀時返回0。

使用od命令可以看到文件中的hole

NewImage

4 read函數

函數聲明:

#include <unistd.h>ssize_t read(int fd, void *buf, size_t nbytes);

返回值:

  • 正整數:讀入的字節數
  • 0:文件結尾
  • -1: error

細節說明:

在一些情況下,函數返回的字節數比指定的讀入字節數要小,多數是因為讀到了文件末尾,或者指定的讀取位置中包含的字節數小于指定的讀入字節數,這時,read返回的為可讀到的字節數。

5 write函數

函數聲明:

#include <unistd.h>ssize_t write (int fd, const void *buf, size_t nbytes);

返回值:

  • 非負整數:寫入的字節數,OK
  • -1: Error

返回值總是等于參數nbytes的值,否則就會報錯。

對于常規的文件來說,寫操作總是從當前文件偏移量開始。

三、小結

簡單地介紹了一下常用的文件IO操作,并介紹了一些使用上的細節,比較常規。

下一篇講介紹更多文件IO的特性,包括:dup,fcntl,sync,fsync和ioctl函數。。

好久沒寫博客了,又第一次用mac下的一個博客軟件寫,不太熟悉,所以寫的比較簡單,以后會寫的更努力。

參考資料:

《Advanced PRogramming in the UNIX Envinronment 3rd》


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区二区三区在线免费观看| 91免费人成网站在线观看18| 亚洲欧美一区二区精品久久久| 亚洲精品日韩激情在线电影| 国产日韩综合一区二区性色av| 欧美丰满片xxx777| 日韩成人中文字幕在线观看| 久久亚洲综合国产精品99麻豆精品福利| 国产精品99一区| 亚洲影院色在线观看免费| 国产精品久久久久久久一区探花| 日韩在线观看成人| 欧美裸身视频免费观看| 国产精品入口尤物| 久久99精品久久久久久青青91| 精品久久久中文| 国产精品99久久久久久白浆小说| 久久久久久亚洲| 欧美大片免费观看在线观看网站推荐| 成人精品久久一区二区三区| 久久久噜噜噜久噜久久| 久久精品美女视频网站| 5566日本婷婷色中文字幕97| 成人中文字幕在线观看| 国产精品国产亚洲伊人久久| 日韩成人免费视频| 日韩av电影在线网| 日本精品久久久久影院| 国产精品色视频| 久久99久久久久久久噜噜| 国产精品福利无圣光在线一区| 国产这里只有精品| 欧美性受xxxx白人性爽| 97视频在线观看网址| 亚洲一级免费视频| 成人性生交大片免费看视频直播| 午夜美女久久久久爽久久| 91在线观看欧美日韩| 亚洲在线观看视频| 久久精品国产亚洲7777| 日韩精品一二三四区| 精品成人国产在线观看男人呻吟| 日韩中文字幕在线视频播放| 国产视频久久网| 一区国产精品视频| 中文字幕欧美在线| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲一级黄色av| 最新日韩中文字幕| 欧美理论片在线观看| 国产精品三级在线| 欧美日韩国产丝袜另类| 亚洲无线码在线一区观看| 亚洲精品一区av在线播放| 热久久视久久精品18亚洲精品| 中日韩美女免费视频网站在线观看| 国产成人一区三区| 中文字幕亚洲二区| 国产成人亚洲综合青青| 国产成人精品国内自产拍免费看| 亚洲有声小说3d| 丝袜一区二区三区| 欧美激情一区二区三区在线视频观看| 久久久久久999| 美女黄色丝袜一区| 韩国三级电影久久久久久| 国产精品中文在线| 欧美大胆a视频| 亚洲在线一区二区| 国内精品视频一区| 亚洲精品国产精品久久清纯直播| 97激碰免费视频| 国产精品爱久久久久久久| 亚洲精品福利在线观看| 97在线看免费观看视频在线观看| 奇米一区二区三区四区久久| 欧美激情精品久久久| 性夜试看影院91社区| 国产热re99久久6国产精品| 欧美日韩免费区域视频在线观看| 欧美日韩午夜视频在线观看| 中文字幕在线看视频国产欧美在线看完整| 黑人巨大精品欧美一区二区一视频| 亚洲天堂av高清| 欧美自拍视频在线| 日韩中文在线中文网在线观看| 91av在线精品| 国产精品情侣自拍| 色阁综合伊人av| 国产偷国产偷亚洲清高网站| 欧美极品少妇xxxxx| 91精品视频在线看| 亚洲最大的免费| 国产精品va在线| 国内精品在线一区| 日韩中文理论片| 7777kkkk成人观看| 亚洲va久久久噜噜噜久久天堂| 欧美性猛交丰臀xxxxx网站| 欧美性理论片在线观看片免费| 国产成人免费av电影| 91精品国产成人| 美女撒尿一区二区三区| 精品偷拍一区二区三区在线看| 成人有码视频在线播放| 国产一区私人高清影院| 欧美专区第一页| 久久精品欧美视频| 欧美性猛交xxxx乱大交蜜桃| 91国语精品自产拍在线观看性色| 中文字幕日韩在线观看| 国产精品日日做人人爱| 在线视频亚洲欧美| 成人免费在线视频网站| 大量国产精品视频| 久久久999成人| 亚洲精品福利在线观看| 久久久久久久久爱| 欧美成人免费全部观看天天性色| 俺去啦;欧美日韩| 91精品国产高清自在线看超| 久久久久久久一| 日韩成人免费视频| 97涩涩爰在线观看亚洲| 久久精品99无色码中文字幕| 国产视频在线一区二区| 色青青草原桃花久久综合| 国产日产久久高清欧美一区| 国语自产精品视频在线看一大j8| 久久久久亚洲精品成人网小说| 久久久在线免费观看| 精品福利免费观看| 亚洲香蕉av在线一区二区三区| 久久中文字幕一区| 国产一区二区三区中文| 欧美一区二区三区免费观看| 这里只有精品在线观看| 亚洲最大的网站| 欧美视频在线观看免费网址| 国产欧美精品一区二区| 国产精品久久久精品| 日韩av一区二区在线| 国产精品扒开腿爽爽爽视频| 国产日韩在线精品av| 欧美精品日韩三级| 日韩电影中文字幕在线观看| 亚洲欧美日韩国产中文| 2024亚洲男人天堂| 精品成人av一区| 国产午夜精品理论片a级探花| 少妇高潮久久久久久潘金莲| 91国内揄拍国内精品对白| 日韩精品在线私人| 欧美在线观看网站| 欧美激情高清视频| 91tv亚洲精品香蕉国产一区7ujn| 国产视频精品va久久久久久| 国产在线一区二区三区| 中文字幕成人精品久久不卡| 欧美日韩成人在线视频| 欧美老女人性视频| 日韩va亚洲va欧洲va国产| 亚洲欧洲自拍偷拍| 中文字幕久精品免费视频|