程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 一起talk C栗子吧(第七十九回:C語言實例

一起talk C栗子吧(第七十九回:C語言實例

編輯:關於C

各位看官們,大家好,上一回中咱們說的是創建進程的例子,這一回咱們說的例子是:父進程與子進程。閒話休提,言歸正轉。讓我們一起talk C栗子吧!

我們在上一回中介紹了如何使用fork函數創建一個新的進程。這一回中,我們在此基礎上介紹父進程與子進程。也可以看作是對fork函數的進一步介紹。

什麼是父進程和子進程呢?我們舉例子來說明:如果進程A在運行的過程中創建了進程B,那麼進程A就是父進程,進程B就是進程A的子進程。這時台下有看官提問了:“既然有父進程了,有沒有母進程呢?“我的回答是沒有。程序的世界屬於父系社會。大家也許聽說過C語言之父,C++之父,有沒有人聽說過C語言之母呢?或者C++之母?哈哈。台下一陣大笑。

接下來,我們通過具體的代碼來說明父進程與子進程。下面是具體的代碼,請大家參考:

#include
#include

int main()
{
    pid_t pid;

    pid = fork();

    sleep(5);

    if(pid > 0)
    {
        printf("PID: %d -> Father Process is running \n",getpid());
    }
    else if(pid == 0)
    {
        printf("PID: %d -> Son Process is running \n",getpid());
    }
    else
    {
        printf("Create process failed \n");
        return 1;
    }

    return 0;
}

在上面的代碼中,我們使用fork函數創建了一個新進程,該新進程就是一個子進程。大家都知道,子進程和父進程共享相同的資源,比如代碼,數據等。因此,在上面的代碼中,main函數中的代碼既能被父進程運行,也能被子進程運行,也就是說父進程和子進程執行相同的代碼。如果真是這樣的話,那麼父進程和子進程運行時會輸出相同的結果。
我們編譯並且運行上面的程序,得到以下結果:

$ ./s                                    //運行編譯後的程序
PID: 3212 -> Father Process is running   //父進程運行時輸出的結果
PID: 3213 -> Son Process is running      //子進程運行時輸出的結果

從上面的程序運行結果可以看到,父進程和子進程運行的結果完全不同,這和我們上面分析的結果不一致呀。是程序運行出錯了呢,還是我們剛才的分析不正確?

我們檢查一下系統中的進程。首先,重新打開一個終端,並且在終端中使用ps命令查看當前系統中的進程,運行結果如下:

$ ps x                                //輸入ps x命令並且執行
  PID TTY      STAT   TIME COMMAND
 1504 ?        Ssl    0:00 cinnamon-session --session cinnamon
   ...                               //與系統相關的進程暫時忽略
 3134 pts/2    S+     0:01 vim       //我們在使用的vim進程
 3147 pts/3    Ss     0:00 bash      
 3190 pts/4    Ss     0:00 bash
 3212 pts/3    S+     0:00 ./s       //從PID看,這是父進程
 3213 pts/3    S+     0:00 ./s       //從PID看,這是子進程
 3215 pts/4    R+     0:00 ps x      //使用ps命令查看進程

通過上面的結果,我們可以看出,系統中確實運行著兩個進程,說明程序運行是正確的。難道是我們剛才的分析不正確?其實,我們剛才的分析和程序的運行結果都沒有問題。之所以有這樣的結果,是因為fork函數在不同的進程中,會產生不同的結果。

我們在剛才的分析中說:父進程和子進程執行相同的代碼,更加具體點就是說,父進程和子進程都執行main函數中的代碼。不過,當父進程運行到fork函數哪一行時,它會創建一個新進程,並且返回新進程的PID,這時的PID是一個大於0的正整數,因此,它只會運行下面這段代碼:

    if(pid > 0)
    {
        printf("PID: %d -> Father Process is running \n",getpid());
    }

當子進程運行到fork函數哪一行時,它不會創建一個新進程,fork函數返回0,這時的PID等於0,因此,它會運行下面這段代碼:

    else if(pid == 0)
    {
        printf("PID: %d -> Son Process is running \n",getpid());
    }

看官們,現在再回頭看看程序的運行結果,是不是有種豁然開朗的感覺?

看官們,正文中就不寫代碼了,詳細的代碼放到了我的資源中,大家可以點擊這裡下載使用。

各位看官,關於父進程與子進程的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved