Linux程序控制(建立 等待 終止)

2021-09-22 20:21:08 字數 2312 閱讀 5009

一、linux程序建立

1.1 fork函式

在linux中fork函式是乙個非常重要的函式,它從已存在程序中建立了乙個新程序。新程序為子程序,而原程序為父程序

#include pid_t fork(void);

返回值:自程序中返回0,父程序返回子程序id,出錯返回-1

程序呼叫fork,當控制轉移到核心中的fork**後,核心做:

1.2 fork常規用法

1.3 fork呼叫失敗的原因

2、程序終止

2.1 程序退出的場景

2.2 程序常見退出方法

正常終止(可以通過 echo $? 檢視程序退出碼):

異常退出:

2.3 _exit 函式`

#include void _exit(int status);

引數:status 定義了程序的終止狀態,父程序通過wait來獲取該值

說明:雖然status是int,但是僅有低8位可以被父程序所用。所以_exit(-1)時,在終端執行$?發現返回值

是255。

2.4 exit函式

#include void exit(int status);
exit最後也會呼叫exit, 但在呼叫exit之前,還做了其他工作:

執行使用者通過 atexit或on_exit定義的清理函式。

關閉所有開啟的流,所有的快取資料均被寫入

呼叫_exit

2.5 return退出

return是一種更常見的退出程序方法。執行return n等同於執行exit(n),因為呼叫main的執行時函式會將main的返回值當做 exit的引數。

3. 程序等待

3.1 程序等待的必要性

3.2 程序等待的方法

wait方法

#include#includepid_t wait(int*status);

返回值:

成功返回被等待程序pid,失敗返回-1。

引數: 輸出型引數,獲取子程序退出狀態,不關心則可以設定成為null

waitpid方法

pid_ t waitpid(pid_t pid, int *status, int options);

返回值:

當正常返回的時候waitpid返**集到的子程序的程序id;

如果設定了選項wnohang,而呼叫中waitpid發現沒有已退出的子程序可收集,則返回0;

如果呼叫**錯,則返回-1,這時errno會被設定成相應的值以指示錯誤所在;

引數: pid:

pid=-1,等待任乙個子程序。與wait等效。

pid>0.等待其程序id與pid相等的子程序。

status:

wifexited(status): 若為正常終止子程序返回的狀態,則為真。(檢視程序是否是正常退出)

wexitstatus(status): 若wifexited非零,提取子程序退出碼。(檢視程序的退出碼)

options:

wnohang: 若pid指定的子程序沒有結束,則waitpid()函式返回0,不予以等待。若正常結束,則返回該

子程序的id。

如果子程序已經退出,呼叫wait/waitpid時,wait/waitpid會立即返回,並且釋放資源,獲得子程序退出資訊。

如果在任意時刻呼叫wait/waitpid,子程序存在且正常執行,則程序可能阻塞。

如果不存在該子程序,則立即出錯返回。

3.3 獲取子程序status

wait和waitpid,都有乙個status引數,該引數是乙個輸出型引數,由作業系統填充。 如果傳遞null,表示不關心子程序的退出狀態資訊。 否則,作業系統會根據該引數,將子程序的退出資訊反饋給父程序。 status不能簡單的當作整形來看待,可以當作點陣圖來看待,具體細節如下圖(只研究status低16位元 位):

Linux程序控制 程序終止 程序等待

目錄 程序終止 程序中退出的方式 void exit int status 與void exit int status 的不同 程序等待 pid t wait int status void waitpid pid t,int status,int options 阻塞與非阻塞 status 判斷程...

程序控制 程序建立 程序終止 程序等待 程式替換

程序建立 fork vfork vfork 的子程序不能在main函式中return退出 fork 和 vfork clone 同樣可以建立程序或者執行緒,它的引數更多,功能更強大 在核心中都是呼叫 do fork 實現程序的建立,只是引數不同 fork 要建立 pcb,虛擬位址空間,頁表 程序終止...

程序建立,終止,等待

今天我們來說一說程序的建立,終止,等待。1 程序的建立 建立乙個程序我們用到的函式是fork函式,它從已存在的程序中建立乙個新的程序,新程序為子程序,而原程序為父程序。fork函式 include pid t fork void 子程序返回0,父程序返回子程序的id,出錯返回 1。值得注意的是,父程...