Linux學習2-fork

複製進程映像 fork()

要想讓進程同時執行多個函數,咱們能夠使用線程或從源程序中建立一個徹底分離的進程,後者就像init的作法同樣,而不像exec調用那樣用新程序替換當前指向的線程。函數

咱們能夠經過調用fork建立一個新進程。這個系統調用複製當前進程,在進程表中建立一個新的表項,新表項中許多屬性和當前進程是相同的。this

新進程幾乎和原進程如出一轍,執行的代碼也所有同樣,但新進程有本身的數據空間,環境和文件描述符。spa

fork和exec函數結合使用就是建立新進程所須要的一切了。線程

#include<sys/type.h>設計

#include<unistd.h>3d

pid_t fork(void);指針

 在父進程中調用返回的是新的子進程的PID。新進程進繼續執行,不過子進程中fork返回的是0.父子進程能夠經過這一點來判斷誰是父子。code

若是fork失敗返回-1,一般是由於父進程所擁有的子進程數目超過規定限制。orm

 fork1.c    blog

#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.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 child";
            n = 5;
             break;
        default :
        message = "this is parenet";
            n = 2;
            break;          
    }

    for(;n>0;n--)
    {
         puts(message);
         sleep(1);
    }
    exit(0);
}

 

 

等待一個進程

當用fork啓動一個子進程時,紫禁城就有了本身的生命週期並將獨立運行。咱們能夠經過在父進程中調用wait函數讓父進程等待子進程的結束。

#include<sys/types.h>

#inlcude<sys/wait.h>

pid_t wait(int *stat_loc);

wait系統調用將暫停父進程知道他的子進程結束爲止。這個調用返回子進程的PID,它一般是已經結束運行的子進程的PID。狀態信息容許父進程瞭解子進程的退出狀態,及

子進程main函數的返回值或子進程中exit函數的退出碼。若是stat_loc不是空指針,狀態信息將被寫入它所指向的位置。

咱們能夠經過sys/wait.h文件中定義的宏來解釋狀態信息。

wait.c

#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
    pid_t pid;
    char *message;
    int n;
    int exit_code;
    printf("fork program starting!\n");
    pid = fork();
    if (pid < 0)
    {
        printf("this is fork error!\n");
        exit(1);
    }else if(pid == 0)
    {
        printf("this is child!\n");
        message = "child";
        n = 5;
        exit_code = 37; 
    }else
    {
        printf("this is parent!\n");
        n = 3;
        message = "parent";
        exit_code = 0;
    }
    for(;n>0;n--)
    {
        puts(message);
        sleep(1);
    }
//程序這一部分等待子進程完成。
if (pid != 0) { int stat_val; pid_t child_pid; child_pid = wait(&stat_val); printf("child has finished:pid=%d\n",child_pid); printf("this stat_val is :%d\n",stat_val);
//若是子進程正常結束,它就取一個非零值
if
(WIFEXITED(stat_val)) { //若是WIFEXITED非零,則返回子進程的退出碼
printf(
"child exited with code %d\n",WEXITSTATUS(stat_val)); }

else { printf("child terminated abnormally\n"); } } exit(exit_code); }

 

 

 

 

 以上內容來自《Linux程序設計第四版》

相關文章
相關標籤/搜索