進程與線程相關(一)

程序和進程

       程序:是指編譯好的二進制文件,在磁盤上,不佔用系統資源(cpu、內存、打開的文件、設備、鎖....)

       進程:是一個抽象的概念,指程序在計算機中的一次執行過程,進程是一個動態的過程描述,佔有計算機的資源,有一定的生命週期,在內存上執行。

       併發:在操作系統中,一個時間段中有多個進程都處於已啓動運行到運行完畢之間的狀態。但任一個時刻點上仍只有一個進程在運行,各個進程相互爭奪CPU時間片。

       並行:多個計算機核心在同時處理多個任務,這多個任務間是並行關係

進程的創建流程
        1.用戶空間運行一個程序,發起進程的創建
        2.操作系統接受用戶申請,開啓進行創建
        3.操作系統分配計算機資源,確定進程狀態
        4.將新創建的進程交給用戶(應用層)使用

創建進程的函數

        fork()函數:創建一個子進程。

        pid_t fork(void);        失敗返回-1;成功返回:① 父進程返回子進程的ID(非負)     ②子進程返回 0

        pid_t類型表示進程ID,但爲了表示-1,它是有符號整型。(0不是有效進程ID,init最小,爲1)

        注意返回值,不是fork函數能返回兩個值,而是fork後,fork函數變爲兩個,父子需【各自】返回一個。

        系統調用fork()函數允許一個進程(父進程)創建一個新的進程(子進程),具體的做法是,新的子進程幾近於對父進程的翻版:子進程獲得父進程的棧,數據段,堆和執行文本段的拷貝,可將此視爲把父進程一分爲二,fork也因此得名。

demo1: 簡單的進程創建

#include <stdio.h>
 
#include <unistd.h>
 
#include <stdlib.h>
 
 
int var = 34;
 
int main(void){
 
    pid_t pid;
 
    pid = fork();
 
    if (pid == -1 ) {
 
        perror("fork");
 
        exit(1);
 
    } else if (pid > 0) {
 
        sleep(2);
 
        var = 55;
 
        printf("I'm parent pid = %d, parentID = %d, var = %d\n", getpid(), getppid(), var);
 
    } else if (pid == 0) {
     
        var = 100;
 
        printf("child pid = %d, parentID=%d, var = %d\n", getpid(), getppid(), var);
 
    }
 
    printf("var = %d\n", var);
 
    return 0;
 
}

 

發佈了36 篇原創文章 · 獲贊 15 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章