1. 程式人生 > >linux程式設計之程序初探

linux程式設計之程序初探

    什麼是程序?一個可執行程式?NO,可執行程式在我們的磁碟上只是一個檔案而已,當可執行程式執行起來以後,那才叫一個程序。

    程序有幾種基本的狀態,執行,就緒,睡眠,停止。

             執行:當CPU在執行這個程式的時候,該程序就處於執行狀態。

             就緒:程序已準備好所有的事情,就只差CPU來運行了,我們稱該程序處於就緒狀態。

             睡眠:也稱阻塞狀態。比如說當程序阻塞去讀一個終端檔案時,我們輸入ps aux可以看到程序的狀態為s或s+,此時程序處於睡眠狀態。

             停止:當程序執行完以後,我們稱該程序處於停止狀態。

程序狀態之間的關係如下:

                                                                

程序的建立:

linux下建立程序非常簡單,只需呼叫fork函式即可,而且fork函式的原型非常的精簡,精簡到不能再精簡了,其宣告如下:

pid_t  fork(void);

該函式沒有引數,只有返回值。雖然如此精簡,但它的含義卻一點也不簡單。當我們呼叫fork時,會建立一個子程序,之後函式返回。但是請注意該函式會返回兩次。一次是在父程序中返回子程序的pid,而在子程序返回0,當然這是該函式呼叫成功的情況,若該函式呼叫失敗,會在父程序返回-1,那麼在子程序返回什麼呢?既然,都已經呼叫失敗了,自然也就沒有子程序產生了。我們可以將該函式理解為:呼叫一次,返回兩次。

當我們在父程序呼叫fork時,底層做了哪些事情呢?底層會將子程序對映到父程序的地址上,也就是說父子兩個程序共享同一個程式碼段,資料段等。當子程序想修改資料段內可修改的資料時,底層會執行拷貝操作,也就是說,它會將那塊資料做一個拷貝,將其放置新的記憶體裡,這就是瀆時共享,寫時複製機制。

既然,父子程序共享同一程式碼段,那麼如何區分父子程序呢?前面提到,fork函式會返回兩次,我們只需判斷它的返回值即可,例如:

			pid_t pid;
			pid = fork();
			//pid > 0說明是在父程序中
			if (pid > 0)
			{
				// 在父程序中執行需要的程式碼
			}
			else if (pid == 0)	//pid == 0 說明是在子程序中
			{
				//在子程序中執行需要的程式碼
			}
			else
			{
				exit(-1);
			}

父程序從開頭往下執行,遇到fork後,子程序建立,那麼子程序是如何執行的呢?是否是同父程序一樣從頭開始執行?其實不是,子程序是從呼叫fork函式後的語句開始執行,以上例程式碼來說,就是從if語句那條開始執行。

前面說過,子程序會和父程序共享同一程式碼段,其實我們更希望子程序能做一些別的事情,這時我們可以使用exec系列函式。exec系列函式一共有6個,分別是execl、execlp、execle、execv、execvp、execve,這些函式功能都是相同的,只是在傳參時有所不同。這裡介紹一個我比較常用的一個execvp,其宣告如下:

int execvp(const char *file, char *const agrv[ ]);

第一個引數傳的是一個檔名,比如說我們的另一個程式的檔名,第二個引數傳的是指標陣列,裡面儲存了想要傳遞的命令列引數。下面是它的呼叫示例:

		<span style="white-space:pre">	</span>char *const ls_argv[] = {"ls","-l",NULL};
			execvp("ls",ls_argv);

當我們呼叫exec系列函式時,該函式會將我們原有的地址空間給替換掉,也就是說,在exec後面的程式碼是執行不到的,除非exec系列函式呼叫失敗。還有就是如果exec函式返回了,則說明exec系列函式呼叫失敗,為什麼呢?因為該函式的返回值只有錯誤返回值,所以只要該系列函式返回,就一定是出錯了。

文章開頭介紹了程序的幾種基本狀態,現在來介紹一下另外一種狀態----殭屍態,看到這個名字感覺有點懵逼了,程序什麼時候跟殭屍搞到一起了?其實起這個名字主要由於該程序的狀態和殭屍很像,殭屍的特點是身體還在,魂沒了,是吧。程序如何達到這個狀態的呢?當父程序fork出子程序的時候,子程序先結束時,子程序此時就處於殭屍態,通過ps aux命令可以看到它的標誌為Z,可能有疑問,子程序都結束了,怎麼還有狀態啊?這是由於子程序的核心資源沒有被釋放,父程序創建出子程序後,父親有義務要為兒子收屍(回收資源),如果父程序一直不退出的話,那麼子程序不就一直處於殭屍程序了嗎,所以我們要使用wait和waitpid這兩個函式來對子程序進行資源回收。

wait函式它是阻塞的,也就是說,它要等子程序結束後才能繼續執行之後的程式碼,而且呼叫一次只能回收一個子程序。這又有問題了,父程序建立了很多個子程序,然後父程序呼叫wait函式,等待子程序結束,那麼父親什麼也不用幹了,專門等著兒子死了,來給它們收屍是吧。這個也不合理。

waitpid函式它是非阻塞的,它的宣告如下:

			pid_t waitpid(pid_t pid, int *status, int options);
其中引數pid有四種情況:

pid < -1 :表示要回收指定程序組內的任意子程序

pid = -1 :表示要回收任意子程序

pid = 0  :表示要回收和當前呼叫waitpid一個組的所有子程序

pid > 0  :表示要回收指定pid的子程序

第二個引數是一個傳出引數,它儲存了程序的退出狀態,若不關心可以傳NULL。

第三個引數比較重要,我們可以傳一個WNOHANG標誌,來表示該函式是非阻塞的。

相關推薦

linux程式設計程序初探

    什麼是程序?一個可執行程式?NO,可執行程式在我們的磁碟上只是一個檔案而已,當可執行程式執行起來以後,那才叫一個程序。     程序有幾種基本的狀態,執行,就緒,睡眠,停止。              執行:當CPU在執行這個程式的時候,該程序就處於執行狀態。  

Linux程式設計程序(二)

在上一篇關於程序的部落格中闡述了程序的概念,總結了程序的狀態以及程序如何描述,這篇部落格就總結下程序的建立,等待,終止以及程序等待的作用。 程序的建立 上一篇部落格中講了關於叉函式的使用,其實叉函式就是程序建立的一個重要手段,演示下面的程序建立³³ 直接上程式碼 // create.

Linux程式設計程序

Linux下多工介紹 首先,簡單介紹下多工系統,任務,程序,執行緒分別是什麼?之間的區別是什麼?從巨集觀角度理解後再針對每一個仔細探究 什麼叫多工系統:多工系統指可以同一時間內執行多個應用程式,每個應用程式被稱作一個任務。 任務定義:任務是一個邏輯概念,指由一個軟體完成

linux程式設計程序控制

(一)fork #include <unistd.h> pid_t fork(void); 返回值:有兩個,一個是子程序的ID,另一個為零。當返回值為0時,進入子程序,大於0進入父程序,返回-1時建立程序錯誤。 子程序與父程序的比較:

Linux系統程式設計程序

1、程序控制塊=程序描述符(PCB) 程序狀態(4/5種):就緒(初始化),執行,掛起(=等待), 停止 PBC成員: 1、程序id 2、程序狀態 3、程序切換需要儲存和恢復的CPU暫存器 4、描述虛擬地址空間資訊 5、描述控制終端的資訊 6、當

linux系統程式設計程序(八):守護程序詳解及建立,daemon()使用

一,守護程序概述 Linux Daemon(守護程序)是執行在後臺的一種特殊程序。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。它不需要使用者輸入就能執行而且提供某種服務,不是對整個系統就是對某個使用者程式提供服務。Linux系統的大多數伺服器就是通過守護程序實現的。常見的守護程序包括系

linux系統程式設計程序(四):程序退出exit,_exit區別即atexit函式

一,程序終止有5種方式: 正常退出: 從main函式返回 呼叫exit 呼叫_exit 異常退出: 呼叫abort 由訊號終止 二,exit和_exit區別: 關於_exit():        #include <unistd.h>     

學習Linux C程式設計程序控制程式設計

建立程序 fork fork 的定義 在 Linux 中,我們使用 fork 來建立一個子程序 fork 的返回值 fork 函式有些特殊,成功它返回 2 次,失敗返回 -1,利用這個特性可以判斷當前的程序是子程序還是父程序:  1. 在子程序中返回 0  2.

linux系統程式設計程序(一)

本節目標:什麼是程式什麼是程序程序資料結構程序與程式區別與聯絡一,什麼是程式?程式是完成特定任務的一系列指令集合二,什麼是程序?從使用者的角度來看程序是程式的一次動態執行過程從作業系統的核心來看,程序是作業系統分配的記憶體、CPU時間片等資源的基本單位。程序是資源分配的最小單位每一個程序都有自己獨立的地址空間

linux系統程式設計程序的環境變數

環境變數: 環境變數,是指在作業系統中用來指定作業系統執行環境的一些引數。通常具備以下特徵: ① 字串(本質) ② 有統一的格式:名=值[:值] ③ 值用來描述程序環境資訊。 儲存形式:與命令列引數類似。char *[]陣列,陣列名environ,內部儲存

linux系統程式設計程序(二):程序生命週期與PCB(程序控制塊)

本節目標: 程序狀態變遷程序控制塊程序建立程序撤消終止程序的五種方法 一,程序狀態變遷 程序的三種基本狀態 就緒(Ready)狀態 當程序已分配到除CPU以外的所有必要的資源,只要獲得處理機便可立即執行,這時的程序狀態稱為就緒狀態。 執行(Running)狀態 當程序已獲得

Linux程式設計——多程序程式設計

    本文學習Linux環境下的多程序程式設計,在我之前的文章裡已經講過程序與執行緒。本文,再簡單講一下程序的概念,方便接下來的學習。     程序定義:程序是一個具有一定獨立功能的程式的一次執行活動。     程序狀態圖:

Linux程式設計程序,多執行緒求解PI(圓周率)

題目: 連結 多程序: #include <unistd.h> #include <stdio.h> #include <stdlib.h> #define n 100000000.0 int main() { i

windows核心程式設計程序

什麼是程序? 程序是一個正在執行程式的例項。由兩部分組成:一個核心物件,用於管理程序以及一個地址空間,包含所有可執行檔案或DLL模組的程式碼和資料,此外還包含動態記憶體分配。 在分析程序之前,先看下windows程式是如何建立的? Windows應用程式分為CUI和GUI程式,即控

第36天併發程式設計程序

目錄:   1. 基礎概念   2. 建立程序和結束程序   3. 程序之間記憶體空間物理隔離   4. 程序的屬性方法   5. 守護程序   6. 互斥鎖   7. IPC通訊機制   8. 生產者消費者模型 一. 基礎概念 1. 什麼叫做程式,什麼叫做程序?

Windows程式設計程序

    Windows系統中,程序是一個很重要的部分,程序與程序核心物件對應,同時也擁有許多屬性,我們必須一一地去熟悉他們,從而來感知系統。 程序屬性                 &n

併發程式設計程序,多路複用,multiprocess模組

併發 1. 背景知識 2. 什麼是程序 3. 程序排程 4. 併發與並行 5 同步\非同步\阻塞\非阻塞(重點) 6.multiprocess模組 7.殭屍程序與孤兒程序1.背景知識一作業系統的作用: 1:隱藏醜陋複雜的硬體介面,提供良好的抽象介面 2:管

week7:網路程式設計程序

一、執行緒與程序 什麼是執行緒? 執行緒是作業系統能夠進行運算排程的最小單位。它被包含在程序之中,是程序中的實際運作單位。一條執行緒指的是程序中一個單一順序的控制流,一個程序中可以併發多個執行緒,每條執行緒並行執行不同的任務。 什麼是程序?  threads are

linux學習程序控制

首先交代幾個基本概念 1.程式:程式是一個儲存在磁碟上某個目錄中的可執行檔案 2.程序:程式的執行例項被稱為程序 3.程序ID:每個程序都有一個非負整數型表示的唯一程序ID 除了程序ID,每個程序還有一些其他識別符號,下面是相關函式 #include<un

Linux作業系統程序通訊——利用共享儲存區實現SERVER和 CLIENT的通訊

實現思路如下: 用fork( )建立子程序,利用共享儲存區實現SERVER和 CLIENT的通訊 SERVER建立一個KEY為75的共享區: 若共享區的第一個位元組為-1 ,則表示空閒。 若共享區的第一個位元組為-1 ,則表示空閒。 若該位元組值發生變化,則