C庫函數(shù)和系統(tǒng)調(diào)用的區(qū)別

Linux下對(duì)文件操作有兩種方式:系統(tǒng)調(diào)用(system call)和庫函數(shù)調(diào)用(Library functions)

龍沙網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)建站于2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。

fork完后:

(1)有兩個(gè)返回值,子進(jìn)程返回0,父進(jìn)程返回子進(jìn)程的id

(2)父子進(jìn)程誰先運(yùn)行不確定,由調(diào)度系統(tǒng)說了算,但是期望子進(jìn)程先退出,并且父進(jìn)程在子進(jìn)程退出時(shí)讀取子進(jìn)程的狀態(tài)

(3)代碼區(qū)域: 打印與循環(huán)的關(guān)系,例如父子進(jìn)程各自++,第一次打印2個(gè),第二次由2變4,一共打印6次

Fopen(標(biāo)準(zhǔn)C庫函數(shù)提供)——返回值是FILE*

FILE* stdin:  輸入    輸入設(shè)備:鍵盤    默認(rèn)打開文件的描述符:0

FILE* stdout:  輸出    輸出設(shè)備:顯示器    默認(rèn)打開文件的描述符:1

FILE* stderror:  錯(cuò)誤    輸入設(shè)備:顯示器   默認(rèn)打開文件的描述符:2

open(系統(tǒng)調(diào)用提供)——返回值new file descriptor(fd)、-1、error

fwrite(有緩沖區(qū)):由C語言提供緩沖區(qū),默認(rèn)為行緩沖,遇到換行符就刷新,但是當(dāng)重定向到文件時(shí),變成全緩沖,就不刷新,直到緩沖區(qū)寫滿。fork前:暫存在于父進(jìn)程緩沖區(qū)中不刷新,fork后:父進(jìn)程復(fù)制到子進(jìn)程,此時(shí)將緩沖區(qū)也復(fù)制過去。當(dāng)進(jìn)程終止時(shí)再刷新緩沖區(qū)

write(無緩沖區(qū))

 


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

    系統(tǒng)調(diào)用提供的函數(shù)如open, close, read, write, ioctl等,需包含頭文件unistd.h。以write為例:其函數(shù)原型為 size_t write(int fd, const void *buf, size_t nbytes),其操作對(duì)象為文件描述符或文件句柄fd(file descriptor),要想寫一個(gè)文件,必須先以可寫權(quán)限用open系統(tǒng)調(diào)用打開一個(gè)文件,獲得所打開文件的fd,例如 fd=open(/"/dev/video/", O_RDWR)。fd是一個(gè)整型值,每新打開一個(gè)文件,所獲得的fd為當(dāng)前最大fd加1。Linux系統(tǒng)默認(rèn)分配了3個(gè)文件描述符值:0- standard input,1-standard output,2-standard error。系統(tǒng)調(diào)用通常用于底層文件訪問(low-level file access),例如在驅(qū)動(dòng)程序中對(duì)設(shè)備文件的直接訪問。系統(tǒng)調(diào)用是操作系統(tǒng)相關(guān)的,因此一般沒有跨操作系統(tǒng)的可移植性

     系統(tǒng)調(diào)用發(fā)生在內(nèi)核空間,因此如果在用戶空間的一般應(yīng)用程序中使用系統(tǒng)調(diào)用來進(jìn)行文件操作,會(huì)有用戶空間到內(nèi)核空間切換的開銷。事實(shí)上,即使在用戶空間使用庫函數(shù)來對(duì)文件進(jìn)行操作,因?yàn)槲募偸谴嬖谟诖鎯?chǔ)介質(zhì)上,因此不管是讀寫操作,都是對(duì)硬件(存儲(chǔ)器)的操作,都必然會(huì)引起系統(tǒng)調(diào)用。也就是說,庫函數(shù)對(duì)文件的操作實(shí)際上是通過系統(tǒng)調(diào)用來實(shí)現(xiàn)的。例如C庫函數(shù)fwrite()就是通過write()系統(tǒng)調(diào)用來實(shí)現(xiàn)的。這樣的話,使用庫函數(shù)也有系統(tǒng)調(diào)用的開銷,為什么不直接使用系統(tǒng)調(diào)用呢?這是因?yàn)?,讀寫文件通常是大量的數(shù)據(jù)(這種大量是相對(duì)于底層驅(qū)動(dòng)的系統(tǒng)調(diào)用所實(shí)現(xiàn)的數(shù)據(jù)操作單位而言),這時(shí),使用庫函數(shù)就可以大大減少系統(tǒng)調(diào)用的次數(shù)。這一結(jié)果又緣于緩沖區(qū)技術(shù)。在用戶空間和內(nèi)核空間,對(duì)文件操作都使用了緩沖區(qū),例如用 fwrite寫文件,都是先將內(nèi)容寫到用戶空間緩沖區(qū),當(dāng)用戶空間緩沖區(qū)滿或者寫操作結(jié)束時(shí),才將用戶緩沖區(qū)的內(nèi)容寫到內(nèi)核緩沖區(qū),同樣的道理,當(dāng)內(nèi)核緩沖區(qū)滿或?qū)懡Y(jié)束時(shí)才將內(nèi)核緩沖區(qū)內(nèi)容寫到文件對(duì)應(yīng)的硬件媒介。

2。庫函數(shù)調(diào)用

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

網(wǎng)站題目:C庫函數(shù)和系統(tǒng)調(diào)用的區(qū)別
本文URL:http://bm7419.com/article8/jcchip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化網(wǎng)頁設(shè)計(jì)公司、商城網(wǎng)站用戶體驗(yàn)、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)