tft每日頭條

 > 科技

 > 系統api函數

系統api函數

科技 更新时间:2024-10-16 15:39:39

在寫程序的過程中,像MFC,VC 這些編程,都會涉及到函數的調用,有庫函數也有系統函數,下面看一看它們的區别!!

系統調用(system call)和庫函數調用(Library function call)的區别? 理解庫函數的區别和系統調用,首先是kernel mode和user mode這兩個模式是這兩種函數工作時的空間不同。 一、系統調用: 系統調用實際上是指底層的一個調用,就是内核提供的、功能十分強大的一系列的函數。這些系統調用是在内核中實現的。是操作系統為用戶态運行的進程和硬件設備(如CPU、磁盤、打印機等)進行交互提供的一組接口,即就是設置在應用程序和硬件設備之間的一個接口層。可以說是操作系統留給用戶程序的一個接口。 例如linux内核是單内核,結構緊湊,執行速度快,各個模塊之間是直接調用的關系。放眼整個linux系統,從上到下依次是:用戶進程->系統調用接口->linux内核子系統->硬件。linux内核包括了系統調用接口和内核子系統兩部分。或者從下到上:物理硬件->OS内核->OS服務->應用程序。這裡的OS起到了“承上啟下”的關鍵作用,向下管理物理硬件,向上為操作系統服務和應用程序提供接口,這裡的接口就是系統調用了。操作系統提供的少部分系統調用都是由C和彙編混合編寫實現的,其接口用C來定義,具體實現則是彙編,這樣的好處是執行效率高,而且極大的方便了上層的調用。 在linux程序設計就是底層調用的意思,面向的是硬件。例如open,read,read等都是用于底層文件的訪問(low-level file access),例如在驅動程序中對文件的直接訪問;系統調用是操作系統相關的, 因此一般沒有跨操作系統的可移植性;系統調用發生在内核空間,因此如果用戶在用戶空間的一般應用程序中使用系統調用來 進行文件的操作, 會有用戶空間到内核空間的切換開銷。事實上,即使在用戶空間是用庫函數來對文件進行操作,必然會引起系統的調用, 因為文件總是存儲在介質上的,不管是讀還是寫,都是對硬件存儲器的操做,必然引起系統調用。例如C庫函數fwrite和fread就是通過read和write系統函數來實現的。這樣的話,使用庫函數也有系統調用的開銷,為什麼不直接使用系統調用呢: 這是因為讀寫文件通常是大量的數據(這種大量是相對于底層驅動的系統調用所實現的數據操作單位而言),這時,使用庫函數就可以大大減少系統調用的次數(系統調用是一種中斷服務機制,需要提出申請占用CPU或某些資源來對硬件訪問與操做,如I/O操作,文件的讀取更新等)。這一結果又緣于緩沖區技術。在用戶空間和内核空間,對文件操作都使用了緩沖區,例如用fwrite寫文件,都是先将内容寫到用戶空間緩沖區,當用戶空間緩沖區滿或者寫操作結束時,才将用戶緩沖區的内容寫到内核緩沖區,同樣的道理,當内核緩沖區滿或寫結束時才将内核緩沖區内容寫到文件對應的硬件媒介。

二、 庫函數:

顧名思義是把函數放到庫裡,是把一些常用到的函數編完放到一個文件裡,供别人用。别人用的時候把所在的文件名用#include<>加到裡面就可以了,一般放到lib文件裡。庫函數一般分為兩類:一種是C語言标準規定的庫函數,一類是編譯器特定的庫函數。libc就是一個C标準庫,裡面放着一些基本的函數,這些函數都被标準化了。

庫函數調用通常用于應用程序中對一般文件的訪問,庫函數調用是系統無關的,因此移植性好。 庫函數主要由兩方面提供:一是操作系統提供的;另一類是由第三方提供的。 系統提供的這些函數把系統調用進行封裝或者組合,可以實現更多的功能,這樣的庫函數能夠實現一些對于内核來說比較複雜的操作。比如read函數根據參數,直接就能讀文件,而背後隐藏的文件比如在那個磁道,那個扇區,加載到那個内存,是程序員不必關心的問題。這些操作裡面也包含了系統調用。 對于第三方庫,其實和系統庫一樣,隻是他直接利用系統調用的可能性要小一些,而是系統提供的API接口來是實現(API接口是開放的)。比如printf和getchar這樣,他們都是一個“外殼”,真正實現的不是它們本身,而是調用了别的函數。 如printf的實現最終還是調用了putc()和user.h中的write()這樣的系統調用,而另一些則不會使用系統調用,比如strlen,strcat,memcpy等;庫函數大部分是對系統函數的封裝(不絕對),這個世界上很少有絕對的事兒,例如世間一切的長度和質量等數字問題都不是絕對準确的,隻是一個-----約等于。 三、系統調用和庫函數之間的聯系與區别: 事實上,系統調用所提供給用戶的是直接而純碎的高級服務,如果想要更加人性化,具有更符合特定情況的功能,那麼就要我們用戶自己定義,因此衍生了庫函數,它把部分系統調用包裝起來。比如當我們要用C語言打印一句話的時候,如果沒有用到庫函數printf,那麼我們就需要自己實現就需要調用putc()和write()等這樣一些系統函數。顯得比較麻煩,所以系統調用是為了方便使用操作系統的接口,而庫函數則是為了人們編程的方便。 庫函數的調用是語言或者應用程序的一部分,而系統調用則是操作系統的一部分。 系統調用是應用程序與内核交互的接口。人們在長期的編程中發現使用系統函數有個重大的缺點,那就是程序的移植性。例如linux提供的系統調用的函數和windows就不一樣。但是大部分的系統調用函數的速度庫函數調用的速度要快。

更多linux内核視頻教程文檔資料免費領取後台私信【内核】自行獲取.

系統api函數(一篇看懂系統調用和庫函數及API的區别)1

系統api函數(一篇看懂系統調用和庫函數及API的區别)2

Linux内核源碼/内存調優/文件系統/進程管理/設備驅動/網絡協議棧-學習視頻教程-騰訊課堂

庫函數調用則是面向應用開發的,相當于應用程序的api,采用這樣的方式有很多原因:(1):雙緩沖技術;(2):移植性;(3):底層調用本身存在的一些缺陷;(4):讓api也可以有了級别和專門的工作面向;問題一:API和系統調用的區别?API(Application Programming Interface),win32API也就是MicrosoftWindows32位平台的應用程序編程接口。windows規定一切的應用程序優先級為3,為windows自己的為0(0最高,3最低)。windows不允許應用程序直接訪問硬件,但是會提供API函數讓用戶間接地訪問,這樣就會調用系統級API。平時出現的“...非法操作”就是因為應用程序非法訪問硬件造成的。API分為兩種:

第一:用戶級API;替用戶寫好函數,方便調用,使程序員可以将焦點放在設計程序邏輯上面,而不必再編寫繁瑣、重複的程序,不必關注技術的細節。例如VC ,MFC,VB等都是類庫和各種控件,它代替了API的神秘功能。 第二:系統級API;如果應用程序想要和硬件交互,必須調用此類函數。程序員調用的是API(api函數),然後通過與系統調用共同完成函數的功能。因此,API是一個提供給應用程序的接口,一組函數,是與程序猿直接進行交互的。系統調用則不與程序員進行交互,它是根據API函數,通過一個軟件中斷機制向内核提交請求(trap指令類似于一個系統中斷,系統也會有一個特殊的中斷處理函數(interrupt handler)來處理用戶的請求),以獲得内核服務的接口。并不是所有的API函數都一一對應一個系統的調用,有時,一個API函數會需要幾個系統調用共同來完成函數的功能,甚至一些API函數不需要調用相應的系統調用,不需要内核提供的服務。

問題二:什麼是 回調函數?

回調函數就是一個通過函數指針調用的函數,使用回調函數實際上就是在調用某個函數(通常是API函數)時,将自己的一個函數(這個函數為回調函數)的地址作為參數傳遞給那個函數。也就是把需要執行的代碼地址給系統,系統在恰當的時候執行。這時你可以利用這個機會在回調函數中處理消息或完成一定的操作。類似于中斷處理機制,中斷在某方面使計算機變得智能! 系統回調函數必須是由系統調用,但是這個函數可以是用戶編寫的,完成相應的功能服務。

- - 内核技術中文網 - 構建全國最權威的内核技術交流分享論壇

轉載地址:一篇看懂系統調用和庫函數及API的區别 - 圈點 - 内核技術中文網 - 構建全國最權威的内核技術交流分享論壇

系統api函數(一篇看懂系統調用和庫函數及API的區别)3

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved