彙總 strace 系統函式

2021-09-01 03:29:43 字數 2336 閱讀 7561

poll  fstat stat mmap sendto  recvmsg recv

getcwd

*************** poll函式起源於svr3,最初侷限於流裝置。svr4取消了這種限制,允許poll工作在任何描述字上。poll提供的功能與select類似,不過在處理流裝置時,它能夠提供額外的資訊。

#include

int poll(struct pollfd *fdarray, unsigned long nfds, int timeout);

返回:就緒描述字的個數,0-超時,-1-出錯

第乙個引數是指向乙個結構陣列第乙個元素的指標。每個陣列元素都是乙個pollfd結構,用於指定測試某個給定描述字fd的條件。

第二個引數nfds是用來指定陣列fdarray的長度。

最後乙個引數timeout是指定poll函式返回前等待多長時間。它的取值如下:

timeout值     說明

inftim     永遠等待

0     立即返回,不阻塞程序

>0     等待指定數目的毫秒數

***************== stat  fstat  lstat

int stat(const char *restrict pathname, struct stat *restrict buf);

提供檔案名字,獲取檔案對應屬性。感覺一般是檔案沒有開啟的時候這樣操作。

int fstat(int filedes, struct stat *buf);

通過檔案描述符獲取檔案對應的屬性。檔案開啟後這樣操作

int lstat(const char *restrict pathname, struct stat *restrict buf);

連線檔案

三個函式的返回:若成功則為0,若出錯則為-1

給定乙個pathname,stat函式返回乙個與此命名檔案有關的資訊結構,fstat函式獲得已在描述符filedes上開啟的檔案的有關資訊。lstat函式類似於stat,但是當命名的檔案是乙個符號連線時,lstat返回該符號連線的有關資訊,而不是由該符號連線引用的檔案的資訊。

第二個引數是個指標,它指向乙個我們應提供的結構。這些函式填寫由buf指向的結構。

********************==== mmap

linux提供了記憶體對映函式mmap, 它把檔案內容對映到一段記憶體上(準確說是虛擬記憶體上), 通過對這段記憶體的讀取和修改, 實現對檔案的讀取和修改, 先來看一下mmap的函式宣告:

mmap系統呼叫並不是完全為了用於共享記憶體而設計的。它本身提供了不同於一般對普通檔案的訪問方式,程序可以像讀寫記憶體一樣對普通檔案的操作。而posix或系統v的共享記憶體ipc則純粹用於共享目的,當然mmap()實現共享記憶體也是其主要應用之一。

mmap系統呼叫使得程序之間通過對映同乙個普通檔案實現共享記憶體。普通檔案被對映到程序位址空間後,程序可以像訪問普通記憶體一樣對檔案進行訪問,不必再呼叫read(),write()等操作。

記憶體對映的步驟:

用open系統呼叫開啟檔案, 並返回描述符fd.

用mmap建立記憶體對映, 並返回對映首位址指標start.

對對映(檔案)進行各種操作, 顯示(printf), 修改(sprintf).

用munmap(void *start, size_t lenght)關閉記憶體對映.

用close系統呼叫關閉檔案fd.

***************==== getcwd  取當前工作目錄

***************=== recv/recvfrom/recvmsg系統呼叫

功能描述:

從套接字上接收乙個訊息。對於recvfrom 和 recvmsg,可同時應用於面向連線的和無連線的套接字。recv一般只用在面向連線的套接字,幾乎等同於recvfrom,只要將recvfrom的第五個引數設定null。

如果訊息太大,無法完整存放在所提供的緩衝區,根據不同的套接字,多餘的位元組會丟棄。

假如套接字上沒有訊息可以讀取,除了套接字已被設定為非阻塞模式,否則接收呼叫會等待訊息的到來。

返回說明:  

成功執行時,返回接收到的位元組數。另一端已關閉則返回0。失敗返回-1,errno被設為以下的某個值  

eagain:套接字已標記為非阻塞,而接收操作被阻塞或者接收超時

ebadf:sock不是有效的描述詞

econnrefuse:遠端主機阻絕網路連線

efault:記憶體空間訪問出錯

eintr:操作被訊號中斷

einval:引數無效

enomem:記憶體不足

enotconn:與面向連線關聯的套接字尚未被連線上

enotsock:sock索引的不是套接字

運維命令系統之 strace

strace是什麼?按照strace官網的描述,strace是乙個可用於診斷 除錯和教學的linux使用者空間 我們用它來監控使用者空間程序和核心的互動,比如系統呼叫 訊號傳遞 程序狀態變更等。linux核心目前有300多個系統呼叫,詳細的列表可以通過syscalls手冊頁檢視。這些系統呼叫主要分為...

用strace工具跟蹤系統呼叫

linux下可以用strace工具檢視應用程式的系統呼叫。strace h 檢視能呼叫的引數 1.strace o xwatv.log xwatv o xwatv.log 是指定將跟蹤資訊存放在xwatv.log中,xwatv是指要跟蹤的命令或應用程式 2.把生成的log檔案拷貝回windows下進...

strace 跟蹤程序中的系統呼叫

strace常用來跟蹤程序執行時的系統呼叫和所接收的訊號。在linux世界,程序不能直接訪問硬體裝置,當程序需要訪問硬體裝置 比如讀取磁碟檔案,接收網路資料等等 時,必須由使用者態模式切換至核心態模式,通過系統呼叫訪問硬體裝置。strace可以跟蹤到乙個程序產生的系統呼叫,包括引數,返回值,執行消耗...