天天看點

[7]Linux程序控制[1]程序的基礎知識:程序控制函數:

[1]程序的基礎知識:

程序是一個具有一定獨立功能的程式的一次運作活動。程序具有的特點:動态性、并發性、獨立性、異步性。

程序的基本狀态:

[7]Linux程式控制[1]程式的基礎知識:程式控制函數:

程序的辨別符:

  • 程序ID(PID):辨別程序的唯一數字。
  • 父程序的ID(PPID)。
  • 啟動程序的使用者ID(UID)。

程序互斥:

程序互斥是指當有若幹程序都要使用某一共享資源時,任何時刻最多允許一個程序使用,其他要使用該資源的程序必須等待,直到占用該資源者釋放了該資源為止。

程序同步:

一組并發程序按一定的順序執行的過程稱為程序間的同步。具有同步關系的一組并發程序稱為合作程序,合作程序間互相發送的信号稱為消息或事件。

程序排程:

程序排程按一定算法,從一組待運作的程序中選出一個來占有CPU運作。排程方式分為:搶占式排程、非搶占式排程。

常用的排程算法:

- 先來先服務排程算法;

- 短程序優先排程算法;

- 高優先級優先排程算法;

- 時間片輪轉法。

死鎖:

多個程序因競争資源而形成一種僵局,若無外力作用,這些程序都将永遠不能再向前推進。

程序控制函數:

擷取程序ID:

#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);     //擷取本程序ID。
pid_t getppid(void);    //擷取父程序ID。
           

建立子程序(fork):

#include <unistd.h>
pid_t fork(void);
           

fork的奇妙之處在于它被調用一次,卻傳回兩次,它可能有三種不同的傳回值:

1. 在父程序中,fork傳回新建立的子程序的PID;

2. 在子程序中,fork傳回0;

3. 如果出現錯誤,fork傳回一個負值。

建立子程序(vfork):

#include <sys/types.h>
#include <unistd.h>
pid_t vfork(void)
//功能:建立子程序。
           

fork與vfork的差別:

1. fork:子程序拷貝父程序的資料段;vfork:子程序與父程序共享資料段;

2. fork:父、子程序的執行次序不确定;vfork:子程序先運作,父程序後運作。

3. 網上抄的一段,可以再了解了解:

為什麼會有vfork,因為以前的fork很傻,它建立一個子程序時,将會建立一個新的位址空間,并且拷貝父程序的資源,而往往在子程序中會執行exec調用。這樣,前面的拷貝工作就是白費力氣了,這種情況下,聰明的人就想出了vfork,它産生的子程序剛開始暫時與父程序共享位址空間(其實就是線程的概念了),因為這時候子程序在父程序的位址空間中運作,是以子程序不能進行寫操作,并且在兒子霸占着老子的房子時候,要委屈老子一下了,讓他在外面歇着(阻塞),一旦兒子執行了exec 或者exit 後,相于兒子買了自己的房子了,這時候就相于分家了。

exec函數族:

exec用被執行的程式替換調用它的程式。差別在于:fork建立一個新的程序,産生一個新的PID。exec啟動一個新程式,替換原有的程序,是以程序的PID不會改變。

execl

#include<unistd.h>
int execl(const char * path,const char * arg1, ....);
           
  • path:被執行程式名(含完整路徑);
  • arg1 – argn: 被執行程式所需的指令行參數(含程式名),以空指針(NULL)結束。

execlp

#include<unistd.h>
int execlp(const char * path,const char * arg1, …);
           
  • path:被執行程式名(不含路徑,将從path環境變量中查找該程式);
  • arg1 – argn: 被執行程式所需的指令行參數,含程式名。以空指針(NULL)結束。

execv

#include<unistd.h>
int execv (const char * path, char * const argv[]);
           
  • path:被執行程式名(含完整路徑);
  • argv[]: 被執行程式所需的指令行參數數組。

system

#include <stdlib.h>
int system( const char* string );//C庫函數
           

調用fork産生子程序,由子程序來執行參數string所代表的指令。

程序等待(wait):

#include <sys/types.h>
#include <sys/wait.h>
pid_t wait (int* status);
           

程序一旦調用了wait,就立即阻塞自己,由wait自動分析是否目前程序的某個子程序已經退出,如果讓它找到了這樣一個已經變成僵屍的子程序,wait就會收集這個子程序的資訊,并把它徹底銷毀後傳回;如果沒有找到這樣一個子程序,wait就會一直阻塞在這裡,直到有一個出現為止。

繼續閱讀