程序間的關係

2021-08-18 21:16:22 字數 3927 閱讀 9582

程序間有什麼關係呢?我們都知道使用fork函式建立程序是一次呼叫兩次返回。父程序返回子程序的程序id(非0),子程序返回0值。很顯然,使用fork建立出來的兩個程序是父子關係。那如果兩個程序都是同乙個父程序建立出來的,它們是什麼關係呢?「兄弟」關係。那麼,兩個或者多個程序之間,都有什麼關係呢?

在介紹程序間關係之前先介紹兩個重要的概念

前台程序與後台程序

我們輸入的命令由bash幫我們執行相應的程式,但是

當我們使用./命令將自己的寫的可執行程式執行起來,在程式執行結束之前,我們輸入命令都沒有反應,這是為什麼呢?

因為shell可以執行乙個前台(程序)和任意多個後台(程序)。

我將程序兩個字用括號括起來了,因為這麼說還不是很準確,等會再做更正。

前台正在執行我們自己的程式,那麼bash就只能被提到後台去了。而只有前台程序才可以收到來自控制端的資料,此時處於後台的bash是接收不到我們輸入的命令的。

我們執行乙個程式,會預設把它放到前台,有時候我們希望將乙個程序放到後台去執行,

只需要在執行程式後邊再加乙個 & 就可以將乙個程式放到後台去執行了

。如果想要

將後台程序提到前台,使用

命令fg n

n是該後台程序的編號,

可以通過命令 jobs 檢視當前後台正在執行的程序。

除了將後台程序提到前台,還可以

使用命令 bg 

將前台程序提到後台,

程序組

乙個或多個程序可以構成乙個程序集合,叫做程序組。通常,它們與同乙個作業相關聯,可以接受來自同一終端的各種訊號。

每個程序除了有乙個程序id之外,還屬於乙個程序組。每個程序組都有乙個唯一的程序組id。且每個程序組都有乙個組長程序,組長程序的id就是程序組的id。通常,乙個程序組的組長程序就是建立的第乙個程序。或者可以這麼說,建立乙個程序,就建立了乙個程序組,只是現在這乙個程序組裡邊現在只有乙個程序(組長程序)。組長程序還可以建立改組中的其他程序。

乙個程序組,只要有任意乙個程序存在,該組就是存在的,與組長是否存在無關。

作業

首先來看乙個簡單的例子

在這個例子裡邊我們通過管道同時執行兩個程式,乙個hello,乙個sleep。很顯然,這兩個程序是屬於乙個程序組。我們將多個程序同時開啟,認為是為了讓這多個程序一起完成某項任務,將這樣的多個程序組叫做作業。再回到例子中,當輸入ctrl+c回車發現兩個程序都被終止了。說明兩個程序都收到了ctrl+c,那麼,這兩個程序都應該是前台程序,而前邊說shell只允許乙個前台程序,在這裡就推翻了,這是不準確的,應該說是:

shell可以執行乙個前台作業(或程序組)和任意多個後台作業(或程序組)這稱為作業控制。

程序組和作業的區別:

如果作業中的某個程序有建立了乙個子程序,可是子程序不屬於作業,但是屬於程序組

說明:

在前台新起乙個作業,shell被提到後台,當前臺作業退出了,shell就自動被提到前台來繼續執行。如果,我們在新起的作業中建立乙個子程序,然後父程序退出,那麼,子程序會被自動提到後台去執行。

看這樣乙個例子:

會話

會話(session)是乙個或多個程序組的集合。乙個會話可以有乙個控制終端。這通常是登入到其上的終端裝置(終端登入的情況下)或偽終端裝置(網路登入的情況下)。

建立與控制終端連線的會話首程序稱為控制程序。乙個會話中的幾個程序組可被分為乙個前台程序組和任意多個後台程序組。所以乙個會話中應包含乙個控制程序(會話首程序)、乙個前台程序組合任意多個後台程序。

新起兩個作業

sid是指會話id。

如上這裡-bash為控制程序,同時也是前台作業,兩條執行三個sleep程序的命令分別建立了乙個後台作業。這樣bash程序和兩個後台構成了乙個

會話。

ps:-bash和bash的區別是:-bash是在網路中登入的。因為這裡是通過xshell連線到虛擬機器上的,所以是-bash

命令 ps axj | grep myprocess |grep -v grep

myprocess是當前正在執行的程式的名字。

ps命令是process status的縮寫。ps命令用來列出系統中當前執行的那些程序。ps命令列出的是當前那些程序的快照,就是執行ps命令的那個時刻的那些程序,如果想要動態的顯示程序資訊,就可以使用top命令。

ps命令的選項:

a:不僅列出當前使用者的程序,也列出所有其他使用者的程序

x:表示不僅列出當前終端的程序,也列出所有無控制終端的程序

j:表示列出與作業相關的資訊

linux系統中grep命令是一種強大的文字搜尋工具,它能使用正規表示式搜尋文字,並把匹 配的行列印出來。grep全稱是global regular expression print,表示全域性正規表示式版本,它的使用許可權是所有使用者。

主要引數

[options]主要引數:

-c:只輸出匹配行的計數。

-i:不區分大 小寫(只適用於單字元)。

-h:查詢多檔案時不顯示檔名。

-l:查詢多檔案時只輸出包含匹配字元的檔名。

-n:顯示匹配行及 行號。

-s:不顯示不存在或無匹配文字的錯誤資訊。

-v:顯示不包含匹配文字的所有行。

作業控制有關訊號:

jobs:可檢視當前有哪些作業。 

選項: 

-l:顯示程序號; 

-p:僅任務對應的顯示程序號; 

-n:顯示任務狀態的變化; 

-r:僅輸出執行狀態(running)的任務; 

-s:僅輸出停止狀態(stoped)的任務。

fg:將指定(如果後台作業只有乙個不用指定)作業提至前台執行,如果作業處於停止狀態,則給這個作業的每個程序傳送sigcont訊號使之執行。

bg:用於將指定作業放到後台執行,其執行效果與在指令後面加&一樣。如果指定作業處於停止狀態,則向作業中每個程序傳送sigcont訊號使之執行。

ctrl+z:向前臺作業程序傳送sigtstp訊號,不會終止前台程序,而是讓前台程序提到後台程序,且將其狀態設定為stop。

ctr+c:給前台作業中的每個程序傳送sigint訊號,結束前台作業。對後台作業無效。

sigterm(15):給乙個停止的程序傳送這個訊號後,這個訊號並不會立即處理,而要等程序準備執行之前處理,其預設處理動作是結束程序。

程序間的關係

1.每個程序都會有乙個程序組,程序組是多個程序的集合,多個程序組組成乙個會話。檢視程序組的id,其中每個程序組都有乙個組長,程序組的id就是該程序組長的id號。該程序組是否存在取決於程序組中是否有程序,與程序組長是否結束無關。2.設定程序組的id,如果pid為0,那麼將呼叫該函式的程序的pid設定為...

程序間關係

1 程序組 程序組是乙個或多程序的集合。通常,它們同一作業相關聯,可以接收來自同一終端的各種訊號。每個程序組有乙個唯一的程序組id。每個程序都可以有乙個組長程序。組長程序的標識是,其程序組id等於其程序id。組長程序可以建立乙個程序組,建立該組中的程序,然後終止。只要在某個程序組中乙個程序存在,則該...

程序間關係

程序同步 定義 程序之間這種相互合作 協同工作的關係稱為程序的同步。制約關係 直接制約 程序互斥 臨界資源 也稱獨佔資源,是指在一段時間內只允許乙個程序訪問的資源。例如印表機,磁帶機,也可以是程序共享的資料 變數等。定義 當多個程序因為爭奪臨界資源而互斥執行稱為程序的互斥。制約關係 間接制約。臨界資...