chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux系統(tǒng)編程中的文件描述符調(diào)用

C語(yǔ)言編程學(xué)習(xí)基地 ? 來源:博客園 ? 作者:melonstreet ? 2021-09-02 09:50 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

文件描述符

進(jìn)程每打開一個(gè)文件的時(shí)候,會(huì)獲得該文件的文件描述符,而后續(xù)的讀寫操作都把文件描述符作為參數(shù)。在用戶空間或者內(nèi)核空間,都是通過文件描述符來唯一地索引一個(gè)打開的文件。文件描述符使用int類型表示,文件描述符的范圍從0開始,到上限值-1,默認(rèn)情況下,上限值為1024,也就是說,進(jìn)程默認(rèn)情況下最多可以打開1024個(gè)文件。負(fù)數(shù)是不合法的文件描述符,當(dāng)函數(shù)調(diào)用出錯(cuò)時(shí),返回的文件描述符為-1。

每個(gè)進(jìn)程都至少包含三個(gè)文件描述符:

8c65cdc2-0b7a-11ec-8fb8-12bb97331649.png

遵循Linux一切皆文件的概念,文件描述符除了訪問普通文件外,幾乎能夠訪問任何能夠讀寫的東西。包括設(shè)備文件、管道、先進(jìn)先出緩沖區(qū)、套接字等。

open()系統(tǒng)調(diào)用

對(duì)文件進(jìn)行讀寫之前,必須先打開文件。Linux提供了系統(tǒng)調(diào)用open()。open()有兩個(gè)函數(shù)原型:

8c6f5fc2-0b7a-11ec-8fb8-12bb97331649.png

兩個(gè)函數(shù)均可用來打開文件,第二個(gè)函數(shù)比第一個(gè)多了參數(shù)mode,mode指定文件的權(quán)限---當(dāng)創(chuàng)建新文件的時(shí)候才需要。如果文件打開成功,則返回文件描述符,指向pathname所指定的文件。flags參數(shù)用于指定打開的方式,它支持三種訪問模式:

8c7b926a-0b7a-11ec-8fb8-12bb97331649.png

flags參數(shù)還可以與下面的值進(jìn)行按位或運(yùn)算,修改打開文件的行為:

8c8c4a4c-0b7a-11ec-8fb8-12bb97331649.png

舉個(gè)例子,下面的句子表示:以寫的方式打開文件,如果文件不存在,則創(chuàng)建新的文件,并且文件的內(nèi)容為空:

int fd ;

fd = open("file.txt",O_WRONLY|O_CREAT|O_TRUNC,0644);

這里的0644指定了新創(chuàng)建的文件訪問權(quán)限,參數(shù)mode的取值如下:

8c97b33c-0b7a-11ec-8fb8-12bb97331649.png

實(shí)際上最終寫入磁盤的文件訪問權(quán)限是由mode參數(shù)和用戶的文件創(chuàng)建掩碼(umask)執(zhí)行按位與操作得到的。舉個(gè)例子:

8ca9a132-0b7a-11ec-8fb8-12bb97331649.png

按理來說,創(chuàng)建出來的文件的訪問權(quán)限應(yīng)該是-rwxrwxrwx,而查看后發(fā)現(xiàn)其實(shí)不是:

ls -l TEST.txt

-rwxrwxr-x 1 huanzhewu huanzhewu 0 8月 30 21:29 TEST.txt【權(quán)限為0775】

查看當(dāng)前的掩碼:

$ umask

0002

可以發(fā)現(xiàn) 0775 = 0777 ^ (~0002) ,所以0775才是最后的文件訪問權(quán)限。umask是進(jìn)程級(jí)屬性,通過調(diào)用umask()函數(shù)來修改,支持用戶修改新創(chuàng)建的文件和目錄的權(quán)限。

總結(jié)起來可以得到這樣一條公式:

newmode = mode ^ (~ umask)

總結(jié)一下:至此,我們了解了文件打開所提供的兩個(gè)系統(tǒng)調(diào)用函數(shù)open(),了解了打開文件的方式、新建文件的訪問權(quán)限設(shè)置。如果文件打開成功,那么將返回一個(gè)文件描述符,這是一個(gè)非零整數(shù)(因?yàn)?,1,2是進(jìn)行已經(jīng)擁有的文件描述符),否則函數(shù)將返回-1

creat()系統(tǒng)調(diào)用

顧名思義,creat函數(shù)用來創(chuàng)建一個(gè)文件,不過我們可能產(chǎn)生疑問:前面的open函數(shù)使用一些選項(xiàng)后,不是也可以創(chuàng)建新文件嗎?沒錯(cuò),creat函數(shù)完全等價(jià)與下面的open語(yǔ)句:

8cb24800-0b7a-11ec-8fb8-12bb97331649.png

由于選項(xiàng)O_WRONLY|O_CREAT|O_TRUNC組合經(jīng)常使用,因而系統(tǒng)調(diào)用專門使用creat函數(shù)來提供這個(gè)功能。creat函數(shù)的原型如下:

8cbdfdb2-0b7a-11ec-8fb8-12bb97331649.png

其中參數(shù)的描述與open的參數(shù)一致,這里不再贅述。

read()系統(tǒng)調(diào)用

文件打開后,就能夠讀文件了。read()是最基礎(chǔ)、最常見的讀取文件的機(jī)制。read的函數(shù)原型為:

8cd2fe10-0b7a-11ec-8fb8-12bb97331649.png

fd 為文件描述符。每次調(diào)用read函數(shù)時(shí),會(huì)從fd指向的文件的當(dāng)前偏移(或稱文件位置)開始讀取count字節(jié)到buf所指的的內(nèi)存中。隨著文件的讀取,fd的文件位置指針會(huì)向前移動(dòng)。關(guān)于read的讀取,會(huì)出現(xiàn)很多需要思考的問題:

問題一:如果文件長(zhǎng)度為0

問題二:如果文件長(zhǎng)度不夠count長(zhǎng)度

問題三:如果讀取時(shí),read被信號(hào)中斷了

我們一一來看:

問題1屬于“沒有數(shù)據(jù)可讀”,此時(shí)read調(diào)用會(huì)阻塞,直到有數(shù)據(jù)可讀;

問題2屬于到達(dá)數(shù)據(jù)結(jié)尾(EOF),此時(shí)read調(diào)用返回0;

問題三,read調(diào)用返回大于0小于count的值;如果在讀取任何數(shù)據(jù)之前被信號(hào)中斷,則返回-1,同時(shí)把errno設(shè)置為EINTR。

8fdd37ba-0b7a-11ec-8fb8-12bb97331649.png

再來看看問題1,當(dāng)文件沒有數(shù)據(jù)可以讀時(shí)(一開始就沒有),read調(diào)用會(huì)被阻塞,直到文件有數(shù)據(jù)可以讀,這是一種阻塞I/O。如果文件以O(shè)_NONBLOCK模式打開,則文件為非阻塞模式,當(dāng)文件沒有數(shù)據(jù)可以讀時(shí),read系統(tǒng)調(diào)用返回-1,并把errno設(shè)置為EAGAIN。

8fe9f2f2-0b7a-11ec-8fb8-12bb97331649.png

除了errno被設(shè)置為EINTR與EAGAIN,其他情況下都是出現(xiàn)嚴(yán)重的文件讀取錯(cuò)誤,重新執(zhí)行讀操作不會(huì)成功。

write() 系統(tǒng)調(diào)用

write的函數(shù)原型為:

9000f858-0b7a-11ec-8fb8-12bb97331649.png

write的返回值比較簡(jiǎn)單:

寫入失敗返回-1 ,同時(shí)設(shè)置errno的值

寫入成功返回成功寫入的字節(jié)數(shù)。

返回0時(shí)沒有特殊含義,僅表示寫入了0個(gè)字節(jié)的內(nèi)容。

對(duì)于普通文件,write基本能保證每次執(zhí)行調(diào)用能夠?qū)懭肴康膬?nèi)容。對(duì)于其他文件如socket,需要進(jìn)行循環(huán)寫,保證所有的字節(jié)都寫入了文件中:

9014a24a-0b7a-11ec-8fb8-12bb97331649.png

同樣的,當(dāng)以非阻塞的模式打開文件時(shí)(O_NONBLOCK),系統(tǒng)調(diào)用write()會(huì)返回-1,并把errno設(shè)置為EAGAIN。

系統(tǒng)調(diào)用write()時(shí),數(shù)據(jù)從用戶空間的緩沖區(qū)中拷貝到了內(nèi)核空間的緩沖區(qū),但并沒有立即把數(shù)據(jù)寫入磁盤中,這稱為延遲寫。延遲寫的問題在于,如果在數(shù)據(jù)真正寫入磁盤之前系統(tǒng)崩潰了,則數(shù)據(jù)可能丟失。內(nèi)核設(shè)置了一個(gè)時(shí)間,在該時(shí)間內(nèi)將內(nèi)核空間緩沖區(qū)上的數(shù)據(jù)寫入磁盤,該時(shí)間稱為"最大存放時(shí)效"。Linux系統(tǒng)也支持強(qiáng)制文件立即寫入磁盤上,這在后面介紹。

close()系統(tǒng)調(diào)用

程序完成文件的讀寫后,調(diào)用close函數(shù)關(guān)閉文件描述符與文件之間的連接,使得文件描述符可以被重用。close的函數(shù)原型為:

#incldue

int close(int fd);

文件關(guān)閉成功返回0,出錯(cuò)返回-1,并設(shè)置相應(yīng)的errno。文件成功關(guān)閉并不以為著該文件的數(shù)據(jù)已經(jīng)被寫入磁盤。

總結(jié):本文簡(jiǎn)單介紹了文件的打開、創(chuàng)建、讀寫、關(guān)閉操作,介紹了一些常用的open參數(shù)選項(xiàng),creat與open的等價(jià)性,循環(huán)讀、循環(huán)寫的必要性,也關(guān)注了各個(gè)系統(tǒng)調(diào)用的返回值含義,了解如何設(shè)置非阻塞讀寫,并簡(jiǎn)單提到了延遲寫的問題,在后續(xù)的文件中將介紹同步I/O的內(nèi)容。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11511

    瀏覽量

    213790
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3689

    瀏覽量

    95249

原文標(biāo)題:Linux系統(tǒng)編程:基本 I/O 系統(tǒng)調(diào)用

文章出處:【微信號(hào):cyuyanxuexi,微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    STM32G0b1 USB device cdc顯示設(shè)備描述符請(qǐng)求失敗的原因?怎么解決?

    程序里已經(jīng)包含了USBD_Start(),如果USB外設(shè)自帶DP上拉、阻抗匹配的功能理論上應(yīng)該是可以被VCP識(shí)別到的(驅(qū)動(dòng)也裝了),但實(shí)際上顯示設(shè)備描述符請(qǐng)求失敗。 然后我懷疑是DP1.5K上拉電阻要
    發(fā)表于 07-10 06:16

    ART-PI H750-USB-MSC設(shè)備描述符異常的原因?怎么解決?

    -驗(yàn)證 2.CubeMX配置 2.1 時(shí)鐘配置 2.2 USB配置 2.3 中間件配置 2.4 堆棧配置 3.邏輯分析儀觀察 3.1 主機(jī)發(fā)送請(qǐng)求設(shè)備描述符的SETUP事務(wù)階段
    發(fā)表于 06-19 06:52

    cx3提示未知的描述符是怎么回事?

    我通過配置生成一個(gè)新的工程 運(yùn)行起來總是提示 未知的描述符
    發(fā)表于 06-04 07:08

    通過 FX3 以 5200*3900 分辨率、15fps 的速度從我的 fpga 傳輸視頻數(shù)據(jù)流,但無(wú)法設(shè)置最小/最大比特率描述符值,怎么解決?

    我正試圖通過 FX3 以 5200*3900 分辨率、15fps 的速度從我的 fpga 傳輸視頻數(shù)據(jù)流,但無(wú)法設(shè)置最小/最大比特率描述符值,因?yàn)?b class='flag-5'>描述符大小只有 32 位。 描述符的預(yù)期值應(yīng)該是
    發(fā)表于 05-23 06:35

    將CY7C68013A連接到基板管理控制器 (BMC),讀取設(shè)備描述符時(shí)發(fā)生FX2超時(shí)錯(cuò)誤怎么解決?

    : 使用 ehci-platform 的新高速 USB 設(shè)備編號(hào) 4 [391.934969] usb 1-1:設(shè)備描述符讀取/8,錯(cuò)誤-110 [397.134834] usb 1-1:設(shè)備描述符讀取
    發(fā)表于 05-14 07:36

    USB組合設(shè)備的配置描述符里一定要用IAD描述符嗎?

    USB組合設(shè)備的配置描述符里一定要用IAD描述符
    發(fā)表于 03-11 06:41

    服務(wù)器數(shù)據(jù)恢復(fù)——Ext4文件系統(tǒng)umount失敗的數(shù)據(jù)恢復(fù)案例

    塊組:Ext4文件系統(tǒng)的全部空間被劃分為若干個(gè)塊組,每個(gè)塊組結(jié)構(gòu)基本上相同。 塊組描述符表:每個(gè)塊組都對(duì)應(yīng)一個(gè)塊組描述符,這些塊組描述符統(tǒng)一放在
    的頭像 發(fā)表于 11-13 13:25 ?878次閱讀
    服務(wù)器數(shù)據(jù)恢復(fù)——Ext4<b class='flag-5'>文件系統(tǒng)</b>umount失敗的數(shù)據(jù)恢復(fù)案例

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-網(wǎng)絡(luò)編程示例之網(wǎng)絡(luò)socket程序編程

    ,通過調(diào)用 getsockopt 函數(shù)獲取與該文件描述符相關(guān)的 TCP 連接信息,并判斷連接狀態(tài)是否為已建立(TCP_ESTABLISHED)。如果連接狀態(tài)為已建立,則返回 0;否則返回-1
    發(fā)表于 11-13 09:12

    飛凌嵌入式ElfBoard ELF 1板卡-網(wǎng)絡(luò)編程示例之網(wǎng)絡(luò)socket程序編程

    。下面我們看下詳細(xì)解釋:func_detect_tcp_server_link(int fd): 檢測(cè) TCP 服務(wù)端連接狀態(tài)的函數(shù)。它接受一個(gè)文件描述符 fd,通過調(diào)用 getsockopt 函數(shù)獲取
    發(fā)表于 11-12 10:53

    Linux--IO多路復(fù)用(select,poll,epoll)

    導(dǎo)致的資源浪費(fèi)和低效率問題。它通過將多個(gè)IO操作合并到一個(gè)系統(tǒng)調(diào)用,允許程序同時(shí)等待多個(gè)文件描述符(如sockets、
    的頭像 發(fā)表于 11-06 16:13 ?1031次閱讀

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-通用文件IO模型之write

    write()函數(shù)用于向文件描述符寫入數(shù)據(jù)。函數(shù)原型如下:fd為文件描述符,用于指定要寫入的文件。buf包含要寫入數(shù)據(jù)的緩沖區(qū)。count要
    發(fā)表于 10-14 09:26

    飛凌嵌入式ElfBoard ELF 1板卡-通用文件IO模型之write

    write()函數(shù)用于向文件描述符寫入數(shù)據(jù)。函數(shù)原型如下:fd為文件描述符,用于指定要寫入的文件。buf包含要寫入數(shù)據(jù)的緩沖區(qū)。count要
    發(fā)表于 10-12 09:24

    飛凌嵌入式ElfBoard ELF 1板卡-通用文件I/O模型之close

    close()函數(shù)用于關(guān)閉打開的文件,釋放打開文件時(shí)所占用的系統(tǒng)資源。函數(shù)原型如下:參數(shù)fd是一個(gè)文件描述符,指示要關(guān)閉的
    發(fā)表于 10-11 08:54

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-Linux C接口編程入門之文件I/O

    程之間的通信。管道和套接字也被視為文件,并通過文件描述符進(jìn)行訪問。虛擬文件系統(tǒng)(Virtual File System):虛擬文件系統(tǒng)
    發(fā)表于 10-10 09:11

    飛凌嵌入式ElfBoard ELF 1板卡-Linux C接口編程入門之文件I/O

    程之間的通信。管道和套接字也被視為文件,并通過文件描述符進(jìn)行訪問。虛擬文件系統(tǒng)(Virtual File System):虛擬文件系統(tǒng)
    發(fā)表于 10-09 15:38