#include#includeint main()
else if(ret==0)
else
return 0;
}
程序的終止:常見的程序終止方式有三種:
(1)**執行完畢,結果正確
(2)**執行完畢,結果不正確
(3)**未執行完畢,異常終止
**執行完的情況:
1.main函式返回,返回值叫做程序的退出碼,通過退出碼可以判斷執行結果是否正確(也可以重新整理緩衝區);退出碼為0表示結果正確,退出碼非0表示結果不正確(指令:ecoh $可以檢視上個命令對應程式的退出碼)
2.exit(庫函式)程序退出;本質上是呼叫_exit
exit關閉流並重新整理緩衝區;exit還多呼叫了結束函式(結束函式atexit(函式指標):main函式結束執行呼叫函式);
3._exit程序退出(系統呼叫);_exit不會重新整理緩衝區。
成功返回等待程序的pid,失敗返回-1
1.引數是輸出型引數(表示退出碼+正常/異常退出)
2.返回值是子程序的pid
3.阻塞式的等待,一直到子程序結束才返回wait的
注意事項:wait的呼叫次數必須和子程序的個數一致wait的呼叫次數比較少,會導致殭屍程序wait的呼叫次數比較多,多出來的wait就會呼叫出錯如果有多個子程序,任何乙個子程序結束都會觸發wait的返回
waitpid()方法:
pid_t pid=waitpid(ret,null,0);執行的結果
pid_t pid=waitpid(-1,null,0);執行的結果
pid_t pid =waitpid(-1,null,wnohang);執行的結果
waitpid:指定某個子程序進行等待
waitpi能夠等待某個指定子程序的退出行為和wait非常相似(返回值規則,status引數)waitpid(-1,null,0)就和wait(null是等價的
非阻塞輪循式的wait:
好處是:能夠更接靈活的控制**,充分利用等待時間去做其他的事情
壞處是:**更加複雜
#include #include#includevoid process_create(pid_t* pid,void* func,void*ar**)
if(*pid == 0)
else
}} int main()
; process_create(&pid,execvp,ar**);
return 0;
}
popen:是標準c提供的乙個管道建立函式,其內部操作主要是建立乙個管道,呼叫fork建立子程序,關閉不需用的檔案描述符,呼叫exec函式族執行popen的第乙個引數。然後等到關閉。
file popen( const char command, const char* mode )
引數說明:
command: 是乙個指向以 null 結束的 shell 命令字串的指標。這行命令將被傳到 bin/sh 並使用 -c 標誌,shell 將執行這個命令。
mode: 只能是讀或者寫中的一種,得到的返回值(標準 i/o 流)也具有和 type 相應的唯讀或只寫型別。如果 type 是 「r」 則檔案指標連線到 command 的標準輸出;如果 type 是 「w」 則檔案指標連線到command 的標準輸入。
返回值:
如果呼叫成功,則返回乙個讀或者開啟檔案的指標,如果失敗,返回null,具體錯誤要根據errno判斷。
注意:popen() 函式用建立管道的方式啟動乙個 程序, 並呼叫 shell. 因為管道是被定義成單向的, 所以 type 引數只能定義成唯讀或者只寫, 不能是兩者同時, 結果流也相應的是唯讀或者只寫。
popen() 函式的返回值是乙個普通的標準i/o流, 它只能用 pclose() 函式來關閉, 而不是 fclose() 函式. 向這個流的寫入被轉化為對 command 命令的標準輸入; 而 command 命令的標準輸出則是和呼叫 popen()函式的程序相同,除非這個被command命令自己改變. 相反的, 讀取乙個 「被popen了的」 流, 就相當於讀取 command 命令的標準輸出, 而 command 的標準輸入則是和呼叫 popen函式的程序相同。
system:
system()會呼叫fork()產生子程序,由子程序來呼叫/bin/sh-c string來執行引數string字串所代表的命令,此命令執行完後隨即返回原呼叫的程序。在呼叫system()期間sigchld 訊號會被暫時擱置,sigint和sigquit 訊號則會被忽略。
int system(const char * string);
返回值:
若=-1:出現錯誤
若=0:呼叫成功但未建立子程序
若 >1:成功,子程序的pid
如果system()在呼叫/bin/sh時失敗則返回127,其他失敗原因返回-1。若引數string為空指標(null),則返回非零值。
如果system()呼叫成功則最後會返回執行shell命令後的返回值,但是此返回值也有可能為 system()呼叫/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認執行成功。
system執行過程:
1.fork建立乙個子程序
2.在子程序中呼叫exec函式去執行command
3.在父程序中呼叫wait去等待子程序結束
linux 程序控制
什麼是程序 每乙個程序在系統中都有唯一的id標示它,此id為程序標示符 程序標示符的型別 pit t,其實是乙個無符號整形 乙個程序標示符對應唯一的乙個程序,多個程序標示符可以對應同乙個程式 程序和程式的區別 程式 可執行的二進位制 檔案,這種檔案載入到記憶體中執行就得到了乙個程序 程序 同乙個程式...
Linux程序控制
linux程序控制 獲取pid include include pid t getpdi void 獲取本程序id pdi t getppid vodi 獲取父程序id,及獲取建立子程序的程序id 程序建立 include pid t fork void 建立子程序 呼叫一次返回兩次值 1.父程序中...
linux程序控制
linux程序控制 編寫命令直譯器 一 背景 之前在 計算機作業系統 這本書中已經多次接觸了程序這一概念,而程序在作業系統中具體是做什麼的呢?卻沒有實際的與程序發生過互動,因此也就沒有實際的感受。對於我來說程序僅僅停留在概念的層面上 程序是程式執行時的記憶體空間和設定或者說程序就是程式的進行時。沒有...