01 Linux系統程式設計基礎 程序

2021-09-10 14:20:11 字數 2758 閱讀 9576

1. 並行與併發:區分的關鍵點是「同時」。

並行(parallel):指在同一時刻,有多條指令在多個處理器同時執行。

併發(concurrency):指在同一時刻只能有一條指令執行,但多個程序指令被快速的輪換執行,使得在巨集觀上具有多個程序同時執行的效果。即巨集觀上同時,微觀上交替執行。

2. 程序控制塊pcb

程序執行時,核心為每個程序分配乙個pcb(程序控制塊),維護程序相關的資訊,linux核心的程序控制塊是task_struct結構體。 檢視struct task_struct 結構體定義: vim /usr/src/linux-headers-4.10.0-28/include/linux/sched.h

3.檔案描述符表:包含很多指向file結構體的指標,就在程序控制塊的task_struct結構體中。

ps -aux:程序狀態。

top:動態顯示程序狀態。

kill:指定程序號殺死程序。

killall:指定程序名殺死程序。

./a.out &:檢視當前程序號。

pid:n(程序號):檢視指定程序的父程序號。

#include #include pid_t getpid(void);             //獲取本程序號

pid_t getppid(void); //獲取呼叫此函式的父程序號

pid_t getpgid(pid_t pid); //獲取程序組號

pid_t fork(void); //建立子程序

程序建立函式還是值得一提的,根據返回值判斷父子程序:返回0表示子程序,返回-1表示失敗,返回其他值就是父程序,這個值表示子程序id,因為父程序是沒有函式可以獲取到子程序id的。

fork函式失敗的兩種情況:

1. 程序數到達系統上線,error設定為eagain。

2. 系統記憶體不足,error設定為enomem

每個程序在退出的時候,核心釋放該程序的所有資源,包括開啟的檔案、占用的記憶體等。但是依然為其保留一定的資訊。,這些資訊主要值程序控制塊pcb的資訊(包括程序號、退出狀態、執行時間等)。

#include #include pid_t wait(int *status);

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

功能:

等待任意乙個子程序結束,如果任意乙個子程序結束了,此函式會**該子程序的資源。

引數:status : 程序退出時的狀態資訊。

巨集函式可分為如下三組:

1) 正常退出

wifexited(status)​ 為非0 → 程序正常結束。

wexitstatus(status)​ 如上巨集為真,使用此巨集 → 獲取程序退出狀態 (exit的引數)。

2) 異常終止

wifsignaled(status)​ 為非0 → 程序異常終止。

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

3) 暫停狀態

wifstopped(status)​ 為非0 → 程序處於暫停狀態。

wstopsig(status) 如上巨集為真,使用此巨集 → 取得使程序暫停的那個訊號的編號。

wifcontinued(status) 為真 → 程序暫停後已經繼續執行。

waitid函式:

#include

#include

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

功能:等待子程序終止,如果子程序終止了,此函式會**子程序的資源。

引數:pid : 引數 pid 的值有以下幾種型別:

pid > 0  等待程序 id 等於 pid 的子程序。

pid = 0  等待同乙個程序組中的任何子程序,如果子程序已經加入了別的程序組,waitpid 不會等待它。

pid = -1 等待任一子程序,此時 waitpid 和 wait 作用一樣。

pid < -1 等待指定程序組中的任何子程序,這個程序組的 id 等於 pid 的絕對值。

status : 程序退出時的狀態資訊。和 wait() 用法一樣。

options : options 提供了一些額外的選項來控制 waitpid()。

0:同 wait(),阻塞父程序,等待子程序退出。

wnohang:沒有任何已經結束的子程序,則立即返回。

wuntraced:如果子程序暫停了則此函式馬上返回,並且不予以理會子程序的結束狀態。(由於涉及到一些跟蹤除錯方面的知識,加之極少用到)

返回值:

waitpid() 的返回值比 wait() 稍微複雜一些,一共有 3 種情況:

1) 當正常返回的時候,waitpid() 返**集到的已經**子程序的程序號;

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

3) 如果呼叫**錯,則返回-1,這時 errno 會被設定成相應的值以指示錯誤所在,如:當 pid 所對應的子程序不存在,或此程序存在,但不是呼叫程序的子程序,waitpid() 就會出錯返回,這時 errno 被設定為 echild;

01 Linux系統程式設計 Linux系統呼叫

系統呼叫,顧名思義,說的是作業系統提供給使用者程式呼叫的一組 特殊 介面。使用者程式可以通過這組 特殊 介面來獲得作業系統核心提供的服務,比如使用者可以通過檔案系統相關的呼叫請求系統開啟檔案 關閉檔案或讀寫檔案,可以通過時鐘相關的系統呼叫獲得系統時間或設定定時器等。從邏輯上來說,系統呼叫可被看成是乙...

系統程式設計 01 程序基礎

一,概念 1.程序是程式在計算機上的一次執行過程。2.程序的狀態 就緒 ready 執行 running 阻塞 blocked 二,程序的操作 1.檢視程序 linux系統 指令 1 ps 檢視程序 ps p 檢視程序的pid ps aux bsd風格顯示程序 2 top 實時顯示系統中各個程序的資...

01 linux命令基礎

我們先了解一下命令的標準格式吧!乙個完整的指令的標準格式 linux 通用的格式 指令主題 選項 操作物件 乙個指令可以包含多個選項 操作物件也可以是多個 用法1 ls含義 列出當前工作目錄下的所有檔案和資料夾名稱 用法2 ls 路徑 含義 列出指定路徑下的所有檔案 資料夾名稱 關於路徑 路徑可以分...