各位看官們,大家好,上一回中咱們說的是創建進程的例子,這一回咱們說的例子是:父進程與子進程。閒話休提,言歸正轉。讓我們一起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());
}
看官們,現在再回頭看看程序的運行結果,是不是有種豁然開朗的感覺?
看官們,正文中就不寫代碼了,詳細的代碼放到了我的資源中,大家可以點擊這裡下載使用。
各位看官,關於父進程與子進程的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解。