進程和程序的區別
進程和程序的區別可以理解為,進程是活動的程序,而程序是一個代碼的集合。進程是加載到內存中的程序,而程序沒有加載到內存中,之在磁盤上保存著。下圖是進程的結構,而程序進包含代碼段。
fork.c文件
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
pid_t pid;
char *message;
int n;
printf("fork program starting\n");
pid = fork();
switch(pid)
{
case -1:
perror("fork failed");
exit(1);
case 0:
message = "This is the child";
n = 5;
break;
default:
message = "This is the parent";
n = 3;
break;
}
for(; n > 0; n--) {
puts(message);
sleep(1);
}
exit(0);
}
(1)pid_t是進程號,是唯一表示進程的ID。
(2) pid_t fork(void) 函數
包含的頭文件:#include <sys/types.h>
#include <unistd.h>
調用fork可以創建一個全新的進程。這個系統調用對當前進程進行復制。在進程表裡創建一個新的項目,新項目的許多屬性與當前進程是相同的。新進程和原進程幾乎一模一樣,執行的也是相同的代碼,但新進程有自己的數據空間、自己的環境等。
(3)程序調用了fork函數的時候被分成了兩個進程。在父進程裡,fork函數返回新進程的PID進程號,新進程則返回0,這個可以做為區分父子進程的依據。
父進程和子進程的執行的代碼都和fork.c裡的代碼一致。但是,fork根據不同進程返回不同的PID,那麼父子進程的實際有效代碼部分是不同的,下面我只寫實際有效的代碼:
就是說,進程會根據PID的不同,有選擇的執行各自的代碼。
這個程序將產生兩個進程,新進程(子進程)會輸出消息5次,而父進程之輸出3次。父進程會在子進程打印完它的全部消息之前退出。運行一下這個程序,我們可以看到如下交替輸出的消息:
C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm
讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm
讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm
讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm
將C語言梳理一下,分布在以下10個章節中:
這裡要提醒大家一點,源文件雖然只有一個,但是運行的進程是2個,而不是1個,大家不要混淆。fork函數在父進程裡創建了新的進程,兩個進程執行的是相同的代碼,即代碼段是一樣的。下面我以後台方式運行該文件的可執行文件(./a.out &)(在輸出消息過程中,未輸完),我使用ps命令輸出當前運行的進程:
15922和15923是兩個不同的進程,和上面說的一樣。
參考文獻: Linux程序設計 《Linux程序設計》第四版中文版 PDF下載 http://www.linuxidc.com/Linux/2011-08/41135.htm
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-08/105303p2.htm