程序和進程
程序:是指編譯好的二進制文件,在磁盤上,不佔用系統資源(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;
}