Linux系統程式設計之程序

2021-08-18 23:12:48 字數 3145 閱讀 8018

程序狀態(4/5種):就緒(初始化),執行,掛起(=等待), 停止

pbc成員:

1、程序id

2、程序狀態

3、程序切換需要儲存和恢復的cpu暫存器

4、描述虛擬位址空間資訊

5、描述控制終端的資訊

6、當前工作目錄

7、umask掩碼

8、檔案描述符

9、訊號相關的資訊

10、使用者和使用者組id

11、會話(session)和程序組

12、資源使用上限(命令ulimit -a, 檢視資源上限值)

2.1 環境變數

環境變數,是指在作業系統中用來指定作業系統執行環境的一些引數。通常具備以下特徵:

① 字串(本質) ② 有統一的格式:名=值[:值] ③ 值用來描述程序環境資訊。

2.1、環境變數

在libc庫中使用外部名變數:environ獲取當前系統全部的系統變數。

2.2、獲取和設定環境變數

獲取環境變數介面名稱:

#include 

/*param:

name: 表示環境變數名稱

*/char *getenv(const

char *name);

設定和取消環境變數

#include 

/*param:

name: 環境變數名

value: 環境變數

rewrite:0:不覆蓋,非0:覆蓋

*/int setenv(const

char* name, const

char *value, int rewrite);

/*param:

name:環境變數名

*/void unsetenv(const

char *name);

例子:

建立程序:

#include 

#include

#include

int var = 34;

int main(void)

else

if (pid > 0) else

if (pid == 0)

printf("var = %d\n", var);

return

0;}

4、如何建立n個程序

簡單想想寫下如下**:

for(int i = 0; i

< n; i++)

else

if(pid == 0)

else

}

但這樣事實果真如此嗎?上述情況建立程序會建立2^n-1個程序,因為在子程序中還會去建立孫程序,如此子子孫孫建立得不是n個程序。避免已建立的子程序也去建立程序,我們應該在else if(pid == 0)上就break來跳出當前的for迴圈。

set follow-fork

-mode child //切換子程序

set follow-fork

-mode father //gdb下預設進入父程序,切換回子程序

在gdb下上面兩個命令實現父程序和子程序的切換

孤兒程序:父程序優先於子程序結束,則子程序成為孤兒程序,孤兒程序由init程序管理。

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

1. 子程序都是通過父程序來**的。如果父程序先退出子程序還在執行,就會產生孤兒程序。

2. 殭屍程序是不能用kill 命令清除掉的,因為kill 命令只是用來終止程序的,而殭屍程序已經終止了。

子程序**函式:

#include 

#include

/*param:

status:傳出引數

return:

成功:pid, 失敗:-1

功能:1、阻塞等待子程序 2、**子程序資源 3、獲取程序結束狀態

wifexited(status)=true/false;

wexitstatus(status)獲取子程序退出狀態

wifsignaled(status)=true/false

wtermsig(status)獲取終止子程序的訊號編號

*/pid_t wait(int status);

/*param:

pid:

pid > 0 指定程序**

pid =-1 **任意子程序

pid = 0 **本組任意子程序

pid

status: 參考wait()

options: 0:阻塞**

wnohang:非阻塞**(需要輪詢查)

return:

成功:pid 失敗 -1 返回0:options=wnohang,此時子程序未結束

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

特點:1. 如果子程序還在執行會阻塞等待。

2. 帶子程序的終止資訊立即返回。

3. 出錯(return -1)立即返回。

區別:

如果父程序的所有子程序都還在執行,呼叫wait將使父程序阻塞,而呼叫waitpid時如果在options引數中指定wnohang可以使父程序不阻塞而立即返回0。

wait等待第乙個終止的子程序,而waitpid可以通過pid引數指定等待哪乙個子程序。

系統程式設計之程序

一 程序相關概述 1 相關指令 ps aux 檢視所有程序 ps aux grep 程序 只會過濾出指定程序資訊 top 指令類似windows任務管理器 2 程序描述符 pid pid 0 稱為交換程序 程序排程 pid 1 init程序 系統初始化 二 c程式的儲存空間是如何分配的 從高位址到低...

Linux 系統程式設計 之 程序 Process

知識點 1.python 跨平台 因此使用process類 而不使用 fork 2.程序建立格式 p process target p1,args process1 target 為函式名 args 為函式引數 3.p.start 建立子程序 p.join 1 主程序等待子程序 1s p.termi...

linux系統程式設計之程序訊號的使用

訊號捕捉特性 1.程序正常執行時,預設pcb中有乙個訊號遮蔽字,假定為 它決定了程序自動遮蔽哪些訊號,當註冊了某個訊號捕捉函式,捕捉到該訊號以後,要呼叫該函式,而該函式有可能執行很長時間,在這期間所遮蔽的訊號不由來指定,而是用sa mask來指定,調完訊號處理函式,再次恢復 2.訊號捕捉函式執行期間...