亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統(tǒng) 2370 0

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

  • 到目前為止我們介紹的所有API都分可歸為兩類:
    • 庫函數(shù)(library function):普通的函數(shù),由一個不屬于我們程序的外部的庫編寫,這種外部的庫的一個典型例子是C庫。這種函數(shù)的參數(shù)傳遞是通過寄存器或者堆棧來實(shí)現(xiàn)的,執(zhí)行的時候直接跳轉(zhuǎn)到該函數(shù)代碼的開頭,也就是我們學(xué)過的典型的C語言函數(shù)調(diào)用的方式。這種庫函數(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)的,并且需要做一個額外的操作。(例如在操作系統(tǒng)上提到的,轉(zhuǎn)換進(jìn)程的狀態(tài),由用戶態(tài)轉(zhuǎn)為內(nèi)核態(tài))可是為什么我們在實(shí)際寫代碼的時候沒有任何的區(qū)別?因為GNU C庫已經(jīng)為我們給這些系統(tǒng)函數(shù)外面包了一層,我們調(diào)用起來就和調(diào)用庫函數(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)視另一個程序的執(zhí)行,并列出該程序所調(diào)用的所有system calls和所接收到的所有signal。
  • strace輸出的每一行代表一個system call或者signal。對于system call來說,首先是該system call的名字,然后是其參數(shù),最后是返回值。而signal的輸出則是signal symbol和一個signal字符串的形式。
  • 接下來我們進(jìn)入主題,介紹幾個非常重要的系統(tǒng)函數(shù):

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

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

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

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

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

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

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

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

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

  • getrusage有兩個參數(shù)
    • 第一個參數(shù)是類型,如果是RUSAGE_SELF,則返回其自身的統(tǒng)計信息;如果是RUSAGE_CHILDREN,則返回其屬下的所有已結(jié)束的子進(jìn)程的統(tǒng)計信息。
    • 第二參數(shù)是rusage結(jié)構(gòu)的指針。這個結(jié)構(gòu)里面幾個比較重要的成員是:
  • 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時間(gettimeofday: Wall-Clock Time)

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

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

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

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

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

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

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

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

  • 以前我們復(fù)制文件的時候怎么做?打開源文件,打開目標(biāo)文件,申請一塊內(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è)置時間間隔(setitimer: Setting Interval Timers)

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

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

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

8.15 uname

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

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

其他文章:

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

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

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

Linux平臺下制作RedHatEL4的DVD盤

編寫云臺控制程序

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號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 黑人巨大精品战中国美女 | 牛牛a级毛片在线播放 | 亚洲视频在线观看免费视频 | 美女黄色一级毛片 | 日本免费人成黄页网观看视频 | 黄色毛片视频 | 欧美激情精品久久久久久久久久 | 色播影院性播影院私人影吧 | 亚洲麻豆 | 毛片网站免费在线观看 | 四虎一影院区永久精品 | 免费观看一级欧美在线视频 | 日日夜夜摸摸 | 美女很黄很黄免费 | 精品国精品国产自在久国产应用 | 日韩有码在线播放 | 欧美操片 | 久久精品蜜芽亚洲国产a | 日本福利片国产午夜久久 | 国产精品_国产精品_国产精品 | 午夜体验区 | 天天做日日做 | a毛片在线 | 一级做a爰片性色毛片2021 | 欧美不卡视频在线 | 国产精品欧美在线观看 | 九九热免费在线观看 | 狠狠干人人插 | 2020亚洲欧美日韩在线观看 | 中文字幕在线播放 | 久久久在线视频精品免费观看 | 成人久久在线 | 日本阿v精品视频在线观看 日本爱爱免费视频 | 国产精品深爱在线 | 亚洲一区二区三区免费观看 | 日本一级特黄a大片在线 | 激情综合在线 | 中文字幕在线不卡视频 | 一区二区三区无码高清视频 | 亚洲国产精品久久精品成人 | 亚洲国产成人久久一区www |