欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Linux系統(tǒng)函數(shù)

系統(tǒng) 2487 0

ALP Chapter 8 Linux系統(tǒng)函數(shù)(Linux System Calls)

  • 到目前為止我們介紹的所有API都分可歸為兩類:
    • 庫(kù)函數(shù)(library function):普通的函數(shù),由一個(gè)不屬于我們程序的外部的庫(kù)編寫,這種外部的庫(kù)的一個(gè)典型例子是C庫(kù)。這種函數(shù)的參數(shù)傳遞是通過寄存器或者堆棧來實(shí)現(xiàn)的,執(zhí)行的時(shí)候直接跳轉(zhuǎn)到該函數(shù)代碼的開頭,也就是我們學(xué)過的典型的C語(yǔ)言函數(shù)調(diào)用的方式。這種庫(kù)函數(shù)的例子:getopt_long, mkstemp
    • 系統(tǒng)函數(shù)(system call):由Linux內(nèi)核實(shí)現(xiàn)的函數(shù)。這種函數(shù)的參數(shù)傳遞和調(diào)用都是由內(nèi)核實(shí)現(xiàn)的,并且需要做一個(gè)額外的操作。(例如在操作系統(tǒng)上提到的,轉(zhuǎn)換進(jìn)程的狀態(tài),由用戶態(tài)轉(zhuǎn)為內(nèi)核態(tài))可是為什么我們?cè)趯?shí)際寫代碼的時(shí)候沒有任何的區(qū)別?因?yàn)镚NU C庫(kù)已經(jīng)為我們給這些系統(tǒng)函數(shù)外面包了一層,我們調(diào)用起來就和調(diào)用庫(kù)函數(shù)是一樣的。這種系統(tǒng)函數(shù)的例子:open, read
  • See it before explore it,我們來看看系統(tǒng)函數(shù)是什么樣子,先睹為快:/usr/include/asm/unistd.h

8.1 使用strace (Using strace)

  • Strace命令可以監(jiān)視另一個(gè)程序的執(zhí)行,并列出該程序所調(diào)用的所有system calls和所接收到的所有signal。
  • strace輸出的每一行代表一個(gè)system call或者signal。對(duì)于system call來說,首先是該system call的名字,然后是其參數(shù),最后是返回值。而signal的輸出則是signal symbol和一個(gè)signal字符串的形式。
  • 接下來我們進(jìn)入主題,介紹幾個(gè)非常重要的系統(tǒng)函數(shù):

8.2 access: 測(cè)試文件訪問權(quán)限

  • 系統(tǒng)函數(shù)access測(cè)試當(dāng)前進(jìn)程是否有權(quán)限訪問一個(gè)文件。
  • access的第一個(gè)參數(shù)是文件的路徑,第二個(gè)參數(shù)的值可以是:R_OK, W_OK, X_OK,分部對(duì)應(yīng)讀,寫和執(zhí)行。另一個(gè)可選的值是F_OK,這種情況下access只檢測(cè)該文件是否存在。
  • access如果返回0則表示當(dāng)前進(jìn)程擁有指定的權(quán)限。返回-1則表示沒有權(quán)限,并且errno被設(shè)為EACCES(或者EROFS,如果我們對(duì)一個(gè)只讀文件要求可寫權(quán)限的話)

8.3 fcntl: 加鎖以及其他一些文件操作 (Locks and Other File Operatioins)

  • 系統(tǒng)函數(shù)fcntl的第一個(gè)參數(shù)是文件描述符,第二個(gè)是要對(duì)文件執(zhí)行的操作。對(duì)某些操作來說,還有額外的參數(shù)。
  • 對(duì)于加鎖操作來說,有兩種鎖,讀鎖和寫鎖。很顯然,讀鎖是可以并存的,即多個(gè)進(jìn)程可以在同一個(gè)文件上加上各自的讀鎖,寫鎖是排他的,同一時(shí)間只有一個(gè)進(jìn)程可以在一個(gè)文件上加寫鎖。
  • 注意:一個(gè)文件被加鎖并不意味著他不能被別的進(jìn)程打開,讀或者寫。只有當(dāng)別的進(jìn)程試圖對(duì)該文件加鎖時(shí),現(xiàn)有的鎖才會(huì)發(fā)生作用。
  • 其實(shí)在加鎖/解鎖方面,另一個(gè)函數(shù)flock有著相同的效果。我們之所以選擇使用fcntl的原因是:它支持NFS文件系統(tǒng)!

8.4 fsync和fdatasync:flush磁盤緩沖區(qū) (fysnc and fdatasync: Flushing Disk Buffers)

  • fsync的參數(shù)只有一個(gè):需要flush的文件描述符。fdatasync的作用也是一樣。
  • 他們的區(qū)別:fsync保證會(huì)更新文件的修改時(shí)間,而fdatasync不保證。所以理論上fdatasync是會(huì)比fsync更快一點(diǎn)的
  • 但是……目前的linux版本里面這兩個(gè)是完全一樣的,所以大家隨便用吧。

8.5 getrlimit和setrlimit:資源限制 (getrlimit and setrlimit: Resource Limits)

  • 這兩個(gè)系統(tǒng)函數(shù)是和resource limit相關(guān)的。你用過ulimit命令嗎?(反正我沒用過)
  • 對(duì)于每個(gè)資源來說有兩個(gè)limit:一個(gè)是hard limit,一個(gè)是soft limit,其中后者永遠(yuǎn)不能超過前者,并且只有擁有superuser權(quán)限的進(jìn)程可以更改前者。
  • getrlimit和setrlimit的參數(shù)相同:第一個(gè)參數(shù)是資源的類型,第二個(gè)參數(shù)是rlimit結(jié)構(gòu)的指針,這個(gè)結(jié)構(gòu)里面就只有兩個(gè)成員:hard limit和soft limit
  • 幾個(gè)重要的資源類型
    • RLIMIT_CPU:程序執(zhí)行的最大CPU時(shí)間,單位是秒。超過之后程序中止,中止的信號(hào)是SIGXCPU
    • RLIMIT_DATA:程序執(zhí)行的最大內(nèi)存
    • RLIMIT_NPROC:程序孵出的最大子進(jìn)程數(shù)量
    • RLIMIT_NOFILE:程序打開的文件的最大數(shù)量

8.6 getrusage:進(jìn)程統(tǒng)計(jì)信息 (getrusage: Process Statistics)

  • getrusage有兩個(gè)參數(shù)
    • 第一個(gè)參數(shù)是類型,如果是RUSAGE_SELF,則返回其自身的統(tǒng)計(jì)信息;如果是RUSAGE_CHILDREN,則返回其屬下的所有已結(jié)束的子進(jìn)程的統(tǒng)計(jì)信息。
    • 第二參數(shù)是rusage結(jié)構(gòu)的指針。這個(gè)結(jié)構(gòu)里面幾個(gè)比較重要的成員是:
  • ru_utime,類型是timeval結(jié)構(gòu),記錄user time;
  • ru_stime,類型是timeval結(jié)構(gòu),記錄system time;
  • ru_maxrss,記錄最大內(nèi)存使用量

8.7 gettimeofday: Wall-Clock時(shí)間(gettimeofday: Wall-Clock Time)

  • gettimeofday返回的是系統(tǒng)的wall-clock時(shí)間,這個(gè)wall-clock時(shí)間我還真的不知道怎么翻譯,它是一個(gè)timeval結(jié)構(gòu),以秒為單位,里面只有兩個(gè)域,第一個(gè)域就是秒的整數(shù)部分,第二個(gè)域是毫秒。這個(gè)秒的計(jì)算方法是:從1970年1月1號(hào)的凌晨到現(xiàn)在。
  • 很顯然,這么長(zhǎng)長(zhǎng)的秒非常難用。所以localtime這個(gè)函數(shù)負(fù)責(zé)把timeval結(jié)構(gòu)轉(zhuǎn)化為tm結(jié)構(gòu),tm結(jié)構(gòu)就很簡(jiǎn)單了,有tm_year,tm_mon,tm_day,tm_hour等等域,一看就知道什么意思,不說了。
  • 有了tm結(jié)構(gòu)之后,可以用strftime來獲得一個(gè)很好看的輸出。這個(gè)函數(shù)和printf差不多,不同的只是它里面的字符串%Y表示年,%m表示月,等等,具體去看man page吧。(不是我偷懶,要學(xué)linux就必須有看man page的習(xí)慣,我現(xiàn)在是越來越深刻的認(rèn)識(shí)到這一點(diǎn)了)

8.8 mlock家族:鎖定物理內(nèi)存(The mlock Family: Locking Physical Memory)

  • 什么叫鎖定物理內(nèi)存?我們先來復(fù)習(xí)一下操作系統(tǒng)里面換頁(yè)的概念:頁(yè)是內(nèi)存分配的基礎(chǔ),一個(gè)程序運(yùn)行的時(shí)候占據(jù)了物理內(nèi)存中的若干頁(yè)。當(dāng)操作系統(tǒng)發(fā)現(xiàn)物理內(nèi)存不夠用的時(shí)候,他會(huì)根據(jù)一個(gè)調(diào)度算法(通常是找出最近最少使用的)找出最應(yīng)該換出的頁(yè),把那個(gè)頁(yè)空閑出來分配給需要的進(jìn)程。所以這里鎖定物理內(nèi)存的意思就是:我死活就霸著我指定的這些頁(yè)不放,你操作系統(tǒng)要找空閑頁(yè)找別的進(jìn)程去,即時(shí)我很久沒有用他們,你也不準(zhǔn)把他們釋放出來給別人用!頗有點(diǎn)站著茅坑不拉屎的氣魄。
  • 這樣做當(dāng)然是有缺點(diǎn)的,我們可以想象一下每個(gè)進(jìn)程都這么來一下我們的操作系統(tǒng)同學(xué)會(huì)有多么的郁悶與無奈。但這個(gè)方法確實(shí)也是相當(dāng)有用的:1,對(duì)于時(shí)間要求很高的程序,換頁(yè)耗時(shí);2,對(duì)于安全性很高的程序,換頁(yè)勢(shì)必要把頁(yè)內(nèi)的東西寫出到某個(gè)swap文件,這個(gè)文件被侵入者偷看了怎么辦?
  • 鎖定就是mlock,解鎖就是munlock,鎖定當(dāng)前進(jìn)程申請(qǐng)的(也可以包括未來申請(qǐng)的)所有內(nèi)存空間就是mlockall,釋放所有內(nèi)存空間就是munlockall(這個(gè)也可以用來釋放mlock所鎖住的空間)
  • 鎖住很大的空間可能會(huì)導(dǎo)致你的操作系統(tǒng)忙死,導(dǎo)致頻繁的換頁(yè)操作(這個(gè)就是著名的thrashing現(xiàn)象了)。所以理所當(dāng)然的,只有superuser才可以調(diào)用mlock和malockall。
  • 另外注意一個(gè)很猥瑣的現(xiàn)象:如果你的操作系統(tǒng)不幸是采用copy-on-write戰(zhàn)術(shù)的,你申請(qǐng)一塊內(nèi)存然后馬上mlock它就很可能導(dǎo)致不是你想要的結(jié)果。比較猥瑣的一個(gè)對(duì)付方法是:申請(qǐng)一塊內(nèi)存時(shí)候,給這個(gè)內(nèi)存的每個(gè)頁(yè)都寫上那么一點(diǎn)東西,一個(gè)bit足矣。例如下面:
    for (i = 0; i < alloc_size; i += page_size) memory[i] = 0;

8.9 mprotect: 設(shè)置內(nèi)存訪問權(quán)限(mprotect: Setting Memory Permissions)

  • 還記得mmap函數(shù)吧?把一個(gè)文件做內(nèi)存映射,映射的時(shí)候可以指定訪問權(quán)限。mprotect可以修改這樣的內(nèi)存的訪問權(quán)限。
  • 違反mprotect的設(shè)定訪問而訪問內(nèi)存會(huì)生成SIGSEGV signal,所以我們可以通過catch這個(gè)signal來監(jiān)控這塊內(nèi)存的被訪問情況
  • 上文只提到了mmap之后的內(nèi)存可以用mprotect來管理,那么一般的內(nèi)存呢?例如malloc申請(qǐng)出來的,也可以這樣嗎?根據(jù)本人的試驗(yàn),答案是:不可以。

8.10 nanosleep: 高精度休眠(nanosleep: High-Precision Sleeping)

  • 不說了,一聽名字就夠拉風(fēng)了,也知道它是干什么的。注意參數(shù)是timespec結(jié)構(gòu)。但是!它遠(yuǎn)遠(yuǎn)沒有它的名字那么厲害。(我也想要它有納秒級(jí)別的響應(yīng)啊,但拜托你先看看你cpu的主頻)通常來說,它的最小精度是10毫秒。
  • 另外一點(diǎn),sleep會(huì)在收到中斷的時(shí)候被“打醒”,nanosleep也會(huì),但它的第二個(gè)參數(shù)可以返回還有多少時(shí)間才會(huì)到它正常的蘇醒。

8.11 readlink: 讀取symbolic links(readline: Reading Symbolic Links)

  • readlink:三個(gè)參數(shù),第一個(gè)是symbolic link的路徑,第二個(gè)是存放link目標(biāo)的buffer,第三個(gè)是buffer的長(zhǎng)度。
  • 正常情況下,readlink會(huì)返回target字符串的長(zhǎng)度。如果第一個(gè)參數(shù)不是symbolic link,返回-1。
  • 注意:readlink返回的target字符串不是以’\0’結(jié)尾的,需要我們自己添上。

8.12 sendfile:快速數(shù)據(jù)傳輸(sendfile: Fast Data Transfers)

  • 以前我們復(fù)制文件的時(shí)候怎么做?打開源文件,打開目標(biāo)文件,申請(qǐng)一塊內(nèi)存,從源文件讀,把該內(nèi)存寫滿,再把內(nèi)存的東西寫到目標(biāo)文件。如此反復(fù),直到所有源文件的內(nèi)容都拷貝到目標(biāo)文件為止。
  • 現(xiàn)在不需要這種低效的方法了!也不需要額外的這塊內(nèi)存,用sendfile你可以方便快捷的完成這種操作!(怎么感覺像促銷廣告?!)
  • 需要注意的一點(diǎn):sendfile參數(shù)中的文件描述符可以是磁盤文件,socket文件,或者其他設(shè)備。(不限于磁盤文件)

8.13 setitimer: 設(shè)置時(shí)間間隔(setitimer: Setting Interval Timers)

  • 看標(biāo)題大概不明白這個(gè)是干什么的。那么,alarm知道嗎?setitimer就是alarm的強(qiáng)化版。
  • 簡(jiǎn)單的說setitimer會(huì)設(shè)置時(shí)間間隔,在經(jīng)過指定的時(shí)間后,會(huì)發(fā)出一個(gè)signal。setitimer和alarm不同的是,它有三種類型(由第一個(gè)參數(shù)指定):
    • ITIMER_REAL類型:當(dāng)經(jīng)過指定的時(shí)間后,發(fā)出SIGALRM的signal(和alarm相同)
    • ITIMER_VIRTUAL類型:當(dāng)程序執(zhí)行過指定的時(shí)間后(內(nèi)核或者其他進(jìn)程執(zhí)行的時(shí)間不計(jì)算在內(nèi)),發(fā)出SIGVTALRM的signal
    • ITIMER_PROF類型:當(dāng)程序已經(jīng)被該程序所導(dǎo)致的內(nèi)核代碼經(jīng)過指定的時(shí)間后,發(fā)出SIGPROF的signal。

8.14 sysinfo: 獲取系統(tǒng)統(tǒng)計(jì)信息(sysinfo: Obtaining System Statistics)

  • 很簡(jiǎn)單,直接調(diào)用這個(gè)函數(shù)。參數(shù)類型是struct sysinfo*。這個(gè)結(jié)構(gòu)的詳細(xì)信息?看man page去

8.15 uname

  • 這個(gè)也是拿來獲取系統(tǒng)信息的。不過是獲取諸如網(wǎng)絡(luò)名,域名,操作系統(tǒng)版本等等。參數(shù)類型是struct utsname*,還是那句話,查 man page

轉(zhuǎn)自 Colar的共享空間

其他文章:

DOM嵌入式Linux系統(tǒng)啟動(dòng)盤制作

為Pocket PC上的IE創(chuàng)建ActiveX控件

Linux操作系統(tǒng)安裝盤的定制

Linux平臺(tái)下制作RedHatEL4的DVD盤

編寫云臺(tái)控制程序

linux之間如何進(jìn)行串口通訊


google_ad_client = "pub-2416224910262877"; google_ad_width = 728; google_ad_height = 90; google_ad_format = "728x90_as"; google_ad_channel = ""; google_color_border = "E1771E"; google_color_bg = "FFFFFF"; google_color_link = "0000FF"; google_color_text = "000000"; google_color_url = "008000";

Linux系統(tǒng)函數(shù)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 91久久国产口精品久久久久 | 日韩一区二区三区在线观看 | 夜夜夜操操操 | 国产精品欧美一区二区三区不卡 | 成人激情四射 | 亚洲欧美日韩精品高清 | 69性影院在线观看国产精品87 | 欧美精品综合在线 | 精品视频久久 | 久久久精 | 亚洲精品乱码 | 国产馆精品推荐在线观看 | 一级做a免费视频 | 男女啪啪高清无遮挡 | 国产精品一区二区三区四区 | 欧美成年网站 | 欧美八区 | 亚洲一区二区免费视频 | 亚洲AV久久久噜噜噜久久 | 暴操美女视频 | 色播久久 | 在线国产一区二区 | 久久99久久 | 性做久久久久免费看 | 国产成人一区二区三区 | 91精品久久久久久久久久 | 欧美另类在线观看 | 亚洲成人一区 | 成年人免费网 | 91综合视频 | 精品久久久中文字幕一区 | 国精品一区 | 富二代精品视频 | 91免费版在线看 | 国产精品久久久久久婷婷天堂 | 日韩1区| 欧美一区二区黄 | 日本不卡一区二区三区在线观看 | 欧美午夜一区二区三区免费大片 | a毛片视频 | 久久久久久久99精品免费观看 |