天天看點

Linux fork和getpid語句詳解

程序的定義 定義 應用程式關于某資料集合上的一次運作活動 作業系統進行資源配置設定和排程的基本機關

程序是程式的一次執行過程 程序是動态的,程式是靜态的 同一程式同時運作于若幹個資料集合上,該程式将對應與若幹個不同的程序

每個程序擁有獨立的位址空間 位址空間包括代碼段、資料段和堆棧段 代碼段,存儲程式的代碼 資料段,存儲程式的全局變量和動态配置設定的記憶體 堆棧段,存儲函數運作時的局部變量 程序之間的位址空間是隔離的 一個程序崩潰不會影響另一個程序 一個程序崩潰不會影響到作業系統   程序的屬性 程序控制塊 作業系統使用一個結構體記錄程序的各類屬性,該結構體被稱為程序控制塊

程序辨別 程序id,每個程序的id都是唯一的 父程序id

位址空間 代碼段的起始位址和長度 資料段的起始位址和長度 堆棧段的起始位址和長度

打開檔案清單 打開檔案時,在打開檔案清單中記錄被打開檔案的資訊 關閉檔案時,在打開檔案清單中删除被關閉檔案的資訊 程序終止時,作業系統周遊打開檔案清單,将尚未關閉的檔案關閉 getpid原型 原型

#include <sys/types.h>
#include <unistd.h>

pid_t getpid(void);
pid_t getppid(void);           

功能描述 getpid擷取目前程序ID getppid擷取父程序ID pid_t是C語言中使用者自定義類型 在sys/types.h中定義 typedef int pid_t; getpid例子 程式

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
    printf("pid = %x, ppid = %x\n", getpid(), getppid());
    return 0;
}               

運作結果

pid = 4761, ppid = 2570
           

fork原型 原型

#include <unistd.h>

pid_t fork(void);               

功能 建立一個子程序,父子程序并發運作 子程序複制父程序的如下屬性 代碼段、資料段的内容,父子程序擁有相同的代碼和資料 打開檔案清單 不複制程序的PID屬性

傳回值 父程序從fork傳回處繼續執行,在父程序中,fork傳回子程序PID 子程序從fork傳回處開始執行,在子程序中,fork傳回0 fork例子1 程式

#include <stdio.h>
#include <unistd.h>

int main()
{
    int pid;
    pid = fork();
    if (pid == 0)
        puts("child");
    else
        puts("parent");
    return 0;
}               

運作結果

parent
child
           

fork例子1講解 if語句的兩條分支都被執行了 then分支執行puts("child") else分支執行puts("parent")

這是由父子程序并發運作導緻的 子程序執行if語句的then分支 父程序執行if語句的else分支 fork例子2 程式

#include <stdio.h>
#include <unistd.h>

int main()
{
    int pid;
    pid = fork();
    if (pid == 0)
        printf("child: my = %d, parent = %d\n", getpid(), getppid());
    else
        printf("parent: my = %d, child = %d\n", getpid(), pid);
    return 0;
}               

運作結果

parent: my = 6988, child = 6989
child: my = 6989, parent = 6988
           

fork例子2講解 PID資訊 父程序的PID為6988 子程序的PID為6989

子程序執行if語句的then分支 getpid()傳回子程序PID——6989 getppid()傳回父程序PID——6988 是以輸出,child: my = 6989, parent = 6988

父程序執行if語句的else分支 getppid()傳回父程序PID——6988 pid為子程序PID——6989 是以輸出,parent: my = 6988, child = 6989

繼續閱讀