Linux系統程式設計(二)

2021-07-28 14:20:07 字數 2544 閱讀 3861

複習檔案描述符(指向結構體的指標)

exec函式族

fork建立子程序後執行的是和父程序相同的程式(但是有可能執行不同的**分支)子程序往往要呼叫一種exec函式以執行另外乙個程式,當程序呼叫一種exec函式時,該程序的使用者空間**和資料完全被新程式替代,從新程式的啟動例程開始執行,呼叫exec並不建立新的程序,所以呼叫exec前後程序的id並未改變。

重點掌握

execlp函式

載入乙個程序,借助path環境變數

int execlp(const char *file, const char *arg, …);

引數1 要載入的程式的名稱該函式要配合path環境變數來使用,當path中所以目錄搜尋後沒有引數1時則出錯返回

該函式通常用來呼叫系統程式如:ls date cp cat 等命令

#include

2#include

3#include

4int main(void)

5 else

if(pid > 0)

12 else

19return

0; 20 }

補充 命令列引數

描述命令列引數的個數 argc

命令列引數的陣列 argv

execl 函式

載入乙個程序 通過路徑+程式名

execl("/bin/ls","ls","-l",null);
execv函式

/*其它部分相同*/

char *argv = ;

execv("/bin/ls",argv);

練習:將當前系統中的資訊列印到檔案中 主要open dup2 execlp 函式

dup2函式:完成檔案描述符的拷貝

exit(1); //出錯處理

return

0;}總結 exec函式一旦呼叫成功即執行新的程式不返回,只有失敗才返回-1所以通常我們直接在exec函式呼叫後直接呼叫perror()和exit()無需if判斷

**子程序

孤兒程序

父程序先於子程序結束,則子程序成為孤兒程序,子程序的父程序成為init程序 稱為init程序領養孤兒程序

殭屍程序

程序終止,父程序尚未**,子程序殘留資源(pcb)存放在核心中,變成殭屍程序。

wait函式

三個功能:

①阻塞等待子程序退出

②**子程序殘留資源

③獲取子程序結束狀態

pid_t wait(int *status);注意是傳出引數,需要定義乙個變數接受它。成功:清理掉子程序的id,失敗:-1

可借助wait函式傳出引數status來儲存程序的退出狀態。借助巨集函式來進一步來判斷程序終止的具體原因

1 wifexited( status) 為非0 程序正常結束

wexitstatus(status) 如果上巨集為真,實用此巨集可以獲取程序退出狀態(exit的值)

2 wifsigmaled(status) 非0 程序異常終止

wtermsig(status) 如果上巨集為真,實用巨集取得使程序終止的那個訊號的編碼

//主要部分

if( wifexited( status))if(wifsigmaled(status))

**多個子程序用迴圈

一次wait或waitpid呼叫只能清理乙個子程序,清理多個子程序應使用迴圈

while(wait(null))

;//或者

while(waitpid(-1,null,0)); // 參3 為0時阻塞狀態

不同點 第三個引數 wnohang 會探測子程序是否結束,為非阻塞狀態,輪循結構使用do while

int n = 5    //子程序個數

pid_t wpid;

do sleep(1);

}while(n > 0);

系統程式設計(二)

系統程式設計基礎 二 include int access const char pathname,int mode pathname檔名或絕對路徑檔名 mode f ok判斷檔案是否存在 r ok是否可讀 w ok是否可寫 x ok是否可執行 返回值成功返回0,錯誤返回 1 include inc...

Linux 系統程式設計

1 i o操作 2 檔案和目錄管理 3 記憶體管理 1 建立匿名記憶體對映 2 對映 dev zero檔案 類unix 作業系統中,dev zero是乙個特殊的檔案,當你讀它的時候,它會提供無限的空字元 null,ascii nul,0x00 其中的乙個典型用法是用它提供的字元流來覆蓋資訊,另乙個常...

Linux系統程式設計

1.linux程序 守護程序 脫離終端的後台程序 2.linux程序 殭屍程序 3.linux 下程序通訊 其中setsockopt server sockfd,sol socket,so reuseaddr,on,sizeof on 因為每乙個連線都由本地位址和遠端位址的組合唯一確定,所以只要遠端...