溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發(fā)布時間:2020-07-24 06:53:56 來源:網絡 閱讀:356 作者:追夢途中 欄目:編程語言

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

fork完后:

(1)有兩個返回值,子進程返回0,父進程返回子進程的id

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

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

Fopen(標準C庫函數(shù)提供)——返回值是FILE*

FILE* stdin:  輸入    輸入設備:鍵盤    默認打開文件的描述符:0

FILE* stdout:  輸出    輸出設備:顯示器    默認打開文件的描述符:1

FILE* stderror:  錯誤    輸入設備:顯示器   默認打開文件的描述符:2

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


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

write(無緩沖區(qū))

 


1。系統(tǒng)調用

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

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

2。庫函數(shù)調用

標準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),其操作對象為文件指針FILE *pf,要想寫一個文件,必須先以可寫權限用fopen函數(shù)打開一個文件,獲得所打開文件的FILE結構指針pf,例如pf=fopen(/ "~/proj/filename/", /"w/")。實際上,由于庫函數(shù)對文件的操作最終是通過系統(tǒng)調用實現(xiàn)的,因此,每打開一個文件所獲得的FILE結構指針都有一個內核空間的文件描述符 fd與之對應。同樣有相應的預定義的FILE指針:stdin-standard input,stdout-standard output,stderr-standard error。庫函數(shù)調用通常用于應用程序中對一般文件的訪問。庫函數(shù)調用是系統(tǒng)無關的,因此可移植性好。由于庫函數(shù)調用是基于C庫的,因此也就不可能用于內核空間的驅動程序中對設備的操作。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI