歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux C進程與多線程入門

Linux C進程與多線程入門

日期:2017/3/1 9:41:07   编辑:Linux編程

進程和程序的區別

進程和程序的區別可以理解為,進程是活動的程序,而程序是一個代碼的集合。進程是加載到內存中的程序,而程序沒有加載到內存中,之在磁盤上保存著。下圖是進程的結構,而程序進包含代碼段。

代碼實例

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個章節中:

  1. Linux-C成長之路(一):Linux下C編程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
  2. Linux-C成長之路(二):基本數據類型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
  3. Linux-C成長之路(三):基本IO函數操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
  4. Linux-C成長之路(四):運算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
  5. Linux-C成長之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
  6. Linux-C成長之路(六):函數要義 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
  7. Linux-C成長之路(七):數組與指針 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
  8. Linux-C成長之路(八):存儲類,動態內存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
  9. Linux-C成長之路(九):復合數據類型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
  10. Linux-C成長之路(十):其他高級議題

這裡要提醒大家一點,源文件雖然只有一個,但是運行的進程是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

Copyright © Linux教程網 All Rights Reserved