• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 297,  comments - 15,  trackbacks - 0
            Linux下對文件操作有兩種方式:系統調用(system call)和庫函數調用(Library functions)。可以參考《Linux程序設計》(英文原版為《Beginning Linux Programming》,作者是Neil Matthew和Richard Stones)第三章: Working with files。

            1。系統調用
            系統調用提供的函數如open, close, read, write, ioctl等,需包含頭文件unistd.h。以write為例:其函數原型為 size_t write(int fd, const void *buf, size_t nbytes),其操作對象為文件描述符或文件句柄fd(file descriptor),要想寫一個文件,必須先以可寫權限用open系統調用打開一個文件,獲得所打開文件的fd,例如 fd=open(\"/dev/video\", O_RDWR)。fd是一個整型值,每新打開一個文件,所獲得的fd為當前最大fd加1。Linux系統默認分配了3個文件描述符 值:0-standard input,1-standard output,2-standard error。
            系統調用通常用于底層文件訪問(low-level file access),例如在驅動程序中對設備文件的直接訪問。
            系統調用是操作系統相關的,因此一般沒有跨操作系統的可移植性。
            系統調用發生在內核空間,因此如果在用戶空間的一般應用程序中使用系統調用來進行文件操作,會有用戶空間到內核空間切換的開銷。事實上,即使在用戶空間使 用庫函數來對文件進行操作,因為文件總是存在于存儲介質上,因此不管是讀寫操作,都是對硬件(存儲器)的操作,都必然會引起系統調用。也就是說,庫函數對 文件的操作實際上是通過系統調用來實現的。例如C庫函數fwrite()就是通過write()系統調用來實現的。
            這樣的話,使用庫函數也有系統調用的開銷,為什么不直接使用系統調用呢?這是因為,讀寫文件通常是大量的數據(這種大量是相對于底層驅動的系統調用所實現 的數據操作單位而言),這時,使用庫函數就可以大大減少系統調用的次數。這一結果又緣于緩沖區技術。在用戶空間和內核空間,對文件操作都使用了緩沖區,例 如用fwrite寫文件,都是先將內容寫到用戶空間緩沖區,當用戶空間緩沖區滿或者寫操作結束時,才將用戶緩沖區的內容寫到內核緩沖區,同樣的道理,當內 核緩沖區滿或寫結束時才將內核緩沖區內容寫到文件對應的硬件媒介。

            2。庫函數調用
            標準C庫函數提供的文件操作函數如fopen, fread, fwrite, fclose, fflush, fseek等,需包含頭文件stdio.h。以fwrite為例,其函數原型為size_t fwrite(const void *buffer, size_t size, size_t item_num, FILE *pf),其操作對象為文件指針FILE *pf,要想寫一個文件,必須先以可寫權限用fopen函數打開一個文件,獲得所打開文件的FILE結構指針pf,例如 pf=fopen(\"~/proj/filename\", \"w\")。實際上,由于庫函數對文件的操作最終是通過系統調用實現的,因此,每打開一個文件所獲得的FILE結構指針都有一個內核空間的文件描述符 fd與之對應。同樣有相應的預定義的FILE指針:stdin-standard input,stdout-standard output,stderr-standard error。
            庫函數調用通常用于應用程序中對一般文件的訪問。
            庫函數調用是系統無關的,因此可移植性好。
            由于庫函數調用是基于C庫的,因此也就不可能用于內核空間的驅動程序中對設備的操作.

            from:
            http://blog.c114.net/html/07/206807-17143.html
            http://blog.chinaunix.net/u3/94284/showart_1898811.html

            posted on 2010-03-01 22:03 chatler 閱讀(524) 評論(0)  編輯 收藏 引用 所屬分類: Linux_Coding
            <2009年5月>
            262728293012
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

            network

            OSS

            • Google Android
            • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
            • os161 file list

            overall

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            性高湖久久久久久久久| 97久久精品午夜一区二区| 伊人久久大香线蕉AV一区二区| 久久精品夜色噜噜亚洲A∨| 狠狠色丁香婷婷久久综合| 蜜臀av性久久久久蜜臀aⅴ| 国产精品激情综合久久| 狠狠色丁香久久婷婷综合| 97精品国产97久久久久久免费| 一本久道久久综合狠狠躁AV| 亚洲va中文字幕无码久久| 久久久久国产亚洲AV麻豆| 国产成人精品免费久久久久| 久久久久亚洲国产| 久久精品夜色噜噜亚洲A∨| 久久精品中文字幕无码绿巨人 | 亚洲狠狠综合久久| 久久精品国产久精国产一老狼| 久久综合欧美成人| 久久亚洲精品无码AV红樱桃| 久久天天躁狠狠躁夜夜2020老熟妇| 国产精品无码久久久久久| 亚洲午夜久久久久久久久电影网| 久久丝袜精品中文字幕| 四虎国产永久免费久久| 狠狠色丁香久久综合婷婷| 国产产无码乱码精品久久鸭| 亚洲国产另类久久久精品黑人 | 亚洲日韩欧美一区久久久久我| 99久久国产免费福利| 大伊人青草狠狠久久| 国产精品9999久久久久| 丰满少妇高潮惨叫久久久| 色综合久久无码五十路人妻| 精品人妻伦九区久久AAA片69| 欧美日韩精品久久久久| 无码任你躁久久久久久老妇App| 色青青草原桃花久久综合| 亚洲国产精品无码成人片久久| 久久精品aⅴ无码中文字字幕不卡| 怡红院日本一道日本久久 |