天天看點

linux多程序程式設計

一、程序的概念

       首先了解,什麼是程序?

Linux 作業系統是面向多使用者的.在同一時間可以有許多使用者向作業系統發出各種指令.那麼作業系統是怎麼實作多使用者的環境呢? 在現代的作業系統裡面,都有程式和程序的概念。那麼什麼是程式,什麼是程序呢? 通俗的講程式是一個包含可以執行代碼的檔案,是一個靜态的檔案,而程序是一個開始執行但是還沒有結束的程式的執行個體.就是可執行檔案的具體實作.。一個程式可能有許多程序,而每一個程序又可以有許多子程序.依次循環下去,而産生子孫程序。當程式被系統調用到記憶體以後,系統會給程式配置設定一定的資源(記憶體,裝置等等)然後進行一系列的複雜操作,使程式變成程序以供系統調用。在系統裡面隻有程序沒有程式,為了區分各個不同的程序,系統給每一個程序配置設定了一個ID(就象我們的身份證)以便識别。為了充分的利用資源,系統還對程序區分了不同的狀态。将程序分為建立、運作、阻塞、就緒和完成五個狀态。建立表示程序正在被建立,運作是程序正在運作,阻塞是程序正在等待某一個事件發生,就緒是表示系統正在等待CPU 來執行指令,而完成表示程序已經結束了系統正在回收資源。

二、程序的标志

       明白了什麼是程序,接下來要了解程序的标志。

   上面我們知道了程序都有一個ID,那麼我們怎麼得到程序的ID 呢?系統調用getpid 可以得到程序的ID,而getppid 可以得到父程序(建立調用該函數程序的程序)的ID.

#include ;

pid_t getpid(void);

pid_t getppid(void);

程序是為程式服務的,而程式是為了使用者服務的。系統為了找到程序的使用者名,還為程序和使用者建立聯系。這個使用者稱為程序的所有者。相應的每一個使用者也有一個使用者ID。通過系統調用getuid 可以得到程序的所有者的ID。由于程序要用到一些資源,而Linux 對系統資源是進行保護的,為了擷取一定資源程序還有一個有效使用者ID。這個ID 和系統的資源使用有關,涉及到程序的權限.,通過系統調用geteuid 我們可以得到程序的有效使用者ID.。和使用者ID相對應程序還有一個組ID 和有效組ID 系統調用getgid 和getegid 可以分别得到組ID 和有效組ID

三、程序的建立

      學習如何建立程序!    

   建立一個程序的系統調用很簡單.我們隻要調用fork 函數就可以了.

    #include ;

    pid_t fork();

    當一個程序調用了fork 以後,系統會建立一個子程序.這個子程序和父程序不同的地方隻有他的程序ID 和父程序ID,其他的都是一樣.就象符程序克隆(clone)自己一樣。當然建立兩個一模一樣的程序是沒有意義的。為了區分父程序和子程序,我們必須跟蹤fork 的傳回值.。當fork 掉用失敗的時候(記憶體不足或者是使用者的最大程序數已到)fork 傳回-1,否則fork 的傳回值有重要的作用.對于父程序fork 傳回子程序的ID,而對于fork 子程序傳回0。我們就是根據這個傳回值來區分父子程序的,父程序為什麼要建立子程序呢?前面我們已經說過了Linux 是一個多使用者作業系統,在同一時間會有許多的使用者在争奪系統的資源.有時程序為了早一點完成任務就建立子程序來争奪資源。一旦子程序被建立,父子程序一起從fork 處繼續執行,互相競争系統的資源.有時候我們希望子程序繼續執行,而父程序阻塞直到子程序完成任務。這個時候我們可以調用wait 或waitpid 系統調用。

    Fork函數被調用一次,但傳回兩次。兩次傳回的唯一差別是子程序的傳回值是0,而父程序的傳回值則是新子程序的程序ID。子程序獲得父程序資料空間、堆和棧的副本。注意,這是子程序所擁有的副本。父子程序并不共享這些存儲空間部分。

四、通過執行個體加深對多程序的了解

[root@test bdkyr]# cat fork_test.c

/*

*  create by bdkyr

*date 2015-1-21

*/

#include

#define MAXLINE 4096   /* max line length */

int glob = 6;

char buf[]= "a write to stdout\n";

void err_sys(const char *fmt, ...);

static void err_doit(int, int, const char *, va_list);

int main(void){

int var;

pid_t pid;

var = 88;

if (write (STDOUT_FILENO, buf, sizeof(buf) -1) != sizeof(buf)-1)

err_sys("write error");

printf("before fork\n");

if((pid = fork())

err_sys("fork error");

}else if(pid == 0){

glob++;

var++;

}else{

sleep(2);

}

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

exit(0);

void err_sys(const char *fmt, ...){

va_list ap;

va_start(ap, fmt);

err_doit(1, errno, fmt, ap);

va_end(ap);

exit(1);

static void err_doit(int errnoflag, int error, const char *fmt, va_list ap){

vsnprintf(buf, MAXLINE, fmt, ap);

if(errnoflag)

snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s", strerror(error));

strcat(buf, "\n");

fflush(stdout);

fputs(buf, stderr);

fflush(NULL);

[root@test bdkyr]# gcc fork_test.c -o fork_test

[root@test bdkyr]# ./fork_test                 

a write to stdout

before fork

pid=5209, glob = 7, var = 89

pid=5208, glob = 6, var = 88

五、總結

       說到底,多程序我們可以簡單了解為,一個程序表示的,就是一個可執行程式的一次執行過程中的一個狀态。作業系統對程序的管理,典型的情況,是通過程序表完成的。程序表中的每一個

表項,記錄的是目前作業系統中一個程序的情況。對于單 CPU的情況而言,每一特定時刻隻有一個程序占用

CPU,但是系統中可能同時存在多個活動的(等待執行或繼續執行的)程序。fork()用于從已存程序中建立一個新程序,新程序為子程序,老程序為父程序.可以通過檢查"fork()"地傳回值知道哪個是子程序哪個是父程序。父程序得到的傳回值是子程序的程序号,而子程序則傳回0。

       您有收獲嗎?

繼續閱讀