国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

Linux C中庫函數與系統調用的區別詳細解析

2020-10-28 18:49:21
字體:
來源:轉載
供稿:網友

從程序完成的功能來看,函數庫提供的函數通常是不需要操作系統的服務,函數是在用戶空間內執行的,除非函數涉及到I/O操作等,一般是不會切到核心態的。系統調用是要求操作系統為用戶提供進程,提供某種服務,通常是涉及系統的硬件資源和一些敏感的軟件資源等。

函數庫的函數,尤其與輸入輸出相關的函數,大多必須通過Linux的系統調用來完成。因此我們可以將函數庫的函數當成應用程序設計人員與系統調用程序之間的一個中間層,通過這個中間層,我們可以用一致的接口來安全的調用系統調用。這樣程序員可以只要寫一次代碼就能夠在不同版本的linux系統間使用積壓種具體實現完全不同的系統調用。至于如何實現對不同的系統調用的兼容性問題,那是函數庫開發者所關心的問題。

從程序執行效率來看,系統調用的執行效率大多要比函數高,尤其是處理輸入輸出的函數。當處理的數據量比較小時,函數庫的函數執行效率可能比較好,因為函數庫的作法是將要處理的數據先存入緩沖區內,等到緩沖區裝滿了,再將數據一次寫入或者讀出。這種方式處理小量數據時效率比較高,但是在進行系統調用時,因為用戶進程從用戶模式進入系統核心模式,中間涉及了許多額外的任務的切換工作,這些操作稱為上下文切換,此類的額外工作會影響系統的執行效率。但是當要處理的數據量比較大時,例如當輸入輸出的數據量超過文件系統定義的盡寸時,利用系統調用可獲得較高的效率。

從程序的可移植性的角度來看,相對于系統調用,C語言的標準備函數庫(ANSI C) 具備較高的可移植性,在不同的系統環境下,只要做很少的修改,通常情況是不需要修改的。

Linux C中庫函數和系統調用的區別
庫函數是高層的,完全運行在用戶空間,為程序員提供調用真正的在幕后完成實際事務的系統調用的更方便的接口。系統調用在內核態運行并且由內核自己提供。標準C庫函數printf()可以被看做是一個通用的輸出語句,但它實際做的是將數據轉化為符合格式的字符串并且調用系統調用 write()輸出這些字符串。

是否想看一看printf()究竟使用了哪些系統調用? 這很容易,編譯下面的代碼。

復制代碼 代碼如下:

#include <stdio.h>
int main(void)
{ printf("hello"); return 0; } 

使用命令gcc -Wall -o hello hello.c編譯。用命令 strace hello 跟蹤該可執行文件。是否很驚訝? 每一行都和一個系統調用相對應。 strace是一個非常有用的程序,它可以告訴你程序使用了哪些系統調用和這些系統調用的參數,返回值。 這是一個極有價值的查看程序在干什么的工具。在輸出的末尾,你應該看到這樣類似的一行 write(1, "hello", 5hello)。這就是我們要找的。藏在面具printf() 的真實面目。既然絕大多數人使用庫函數來對文件I/O進行操作(像 fopen, fputs, fclose)。 你可以查看man說明的第二部分使用命令man 2 write 。man說明的第二部分專門介紹系統調用(像kill()和read())。 man說明的第三部分則專門介紹你可能更熟悉的庫函數(像cosh()和random())。

你甚至可以編寫代碼去覆蓋系統調用,正如我們不久要做的。駭客常這樣做來為系統安裝后門或木馬。 但你可以用它來完成一些更有益的事,像讓內核在每次某人刪除文件時輸出 “ Tee hee, that tickles!” 的信息

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 海宁市| 南皮县| 渝中区| 威信县| 靖边县| 大庆市| 临夏市| 凌海市| 贡觉县| 汉源县| 九龙坡区| 四子王旗| 丹棱县| 连南| 依安县| 神木县| 高尔夫| 太湖县| 成安县| 河曲县| 塔城市| 通河县| 文昌市| 美姑县| 昭苏县| 伊金霍洛旗| 苍山县| 治多县| 宁夏| 竹北市| 通海县| 成都市| 社旗县| 寿光市| 绥芬河市| 平遥县| 富阳市| 苏尼特左旗| 临西县| 赤壁市| 县级市|