linux環境下的程序

2021-08-19 04:49:58 字數 3431 閱讀 7401

:程式的乙個執行例項,正在執行的程式等,同時是分配系統資源的基本單位

描述程序(pcb):在linux環境下用task_struct的結構體來描述程序,該結構體包含了程序所需要的所有資訊。

task_struct:是核心中linux下的一種資料結構,它會被裝載在ram下包含程序的資訊。

內容分類:

識別符號:程序的唯一識別符號,區別於其他程序

狀態:任務狀態,退出**,退出訊號

優先順序:此程序相比較其他程序的優先順序

上下文資料:程序執行時cpu中暫存器中的資料

i/o資訊:包括顯示的i/o請求,分配給程序的i/o裝置和被程序使用的檔案列表

記賬資訊:輔助程序排程

程序狀態

volatile

long state//說明該程序是否可以執行,還是可中斷等資訊

#define task_running 0 //正在執行或者在就緒佇列中準備執行的程序

#define task_interruptible 1 //處於等待佇列中的程序,直到某個條件有效時進入就緒佇列

#define task_uninterruptible 2 //處於等待佇列中的程序,待資源有效時喚醒,不可由其他程序通過訊號或定時中斷喚醒

#define __task_stopped 4 //程序被暫停,通過其他程序的訊號才能喚醒

#define __task_traced 8 //表示程序被debug追蹤

/* in tsk->exit_state */

#define exit_zombie 16 //殭屍狀態的程序,表示程序被終止,但父程序還沒獲得其終止資訊

#define exit_dead 32//程序死亡

/* in tsk->state again */

#define task_dead 64 //死亡

#define task_wakekill 128 //喚醒並殺死程序

#define task_waking 256//喚醒程序

2.程序的識別符號

pid_t pid;//程序的唯一識別符號

pid_t tgid;//執行緒組的領頭執行緒的pid

在linux環境下,乙個執行緒組所有的執行緒使用和該執行緒組的領頭執行緒相同的pid,並存放在tgid中。

程序的標記符

unsigned

int flags;

flags反映程序的狀態資訊,用於核心識別該程序的當前狀態

常用的狀態

#define pf_forknoexec 0x00000040 //表示程序剛被建立,還沒執行

#define pf_superpriv 0x00000100 //表示該程序有超級使用者特權

#define pf_signaled 0x00000400 //表示程序被訊號殺出

#define pf_exiting 0x00000004 //表示程序開始退出

程序之間的親屬關係

struct task_struct *real_parent;

struct task_struct *parent;

struct list_head children;

struct list_head sibling;

struct task_struct *group_leader;

real_parent指向其父程序,如果建立它的父程序不存在,則指向pid為1的init程序。

parent指向其父程序,當它終止時,必須向它父程序發出訊號,值通常與real_parent相同。

children表示鍊錶的頭部,鍊錶的所有元素都是其子程序。

sibling用於把當前程序插入到兄弟鍊錶中。

group_leader指向其所在程序組的領頭程序。

程序的排程資訊

int prio,static_prio, normal_prio;

unsigned

int rt_priority;

const

struct sched_class *sched_class;

struct sched_entity se;

struct sched_rt_entity rt;

unsigned

int policy;

stati_prio用於儲存靜態優先順序,可以通過nice系統呼叫來進行修改

rt_priority用於儲存實時優先順序。

normal_prio的值取決於靜態優先順序和排程決策。

prio用於儲存動態優先順序。

policy表示程序的排程策略。

程序的排程演算法

#define sched_normal  0//按照優先順序進行排程

#define sched_fifo 1//先進先服務的排程演算法

#define sched_rr 2//時間片輪轉的排程演算法

#define sched_batch 3//用於非互動的cpu消耗型的程序

#define sched_idle 5//系統負載很低時的排程

#define sched_reset_on_fork 0x40000000

建立程序

我們分別可以用fork()和vfork()來建立程序,新建立的程序為子程序,原程序為父程序,**實現如下

#include

#include

#include

int main()

else

sleep(1);

return

0;}

殭屍程序:當程序退出,父程序沒有接收到子程序退出訊號

#include

#include

int main()

else

return

0;}

孤兒程序:父程序先退出,子程序稱之為「孤兒程序」。

#include

#include

#include

int main()

else

if(id==0)

else

return

0;}

Linux下程序與環境變數

1.在shell下可以通過命令env或set檢視當前系統的環境變數資訊。2.獲取環境變數的值 extern char getenv const char name 如果執行成功,此函式返回指定環境變數的值,否則返回null。3.新增環境變數 extern int putenv char string...

Linux程序環境

linux下c程式都是main開始的,main函式的原型是 int main int argc,char argv 其中argc是命令列引數的數目,argc是指向引數的各個指標所構成的陣列。c程式中有3個函式用於正常終止乙個程序,exit和 exit立即進入核心,exit則做一些清理工作後後進入核心...

linux 程序與程序環境

程序與程序環境 程序是執行中的程式,每個程序都執行在各自的虛擬位址空間中,某個程序的崩潰不會影響其它程序的執行。程序間的通訊 ipc 要通過系統核心 系統呼叫 來實現。程序分類 在linux系統中,根據程序的特點,程序可分為3大類 互動程序 批處理程序和守護程序。l 互動程序 由shell啟動的程序...