複習檔案描述符(指向結構體的指標)
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 因為每乙個連線都由本地位址和遠端位址的組合唯一確定,所以只要遠端...