歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux C進程與多線程入門

進程和程序的區別

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

 

代碼實例

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