程序和进程
程序:是指编译好的二进制文件,在磁盘上,不占用系统资源(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;
}