一、什么是进程
进程是正在执行的程序实例。执行程序时,内核会将程序代码载入虚拟内存,为程序变量分配空间,在内核中建立相应的数据结构,以记录与进程有关的各种信息(比如,进程ID、用户ID、组ID以及终止状态等)。
简单来说,就是”执行一个程序或命令“就可以出发一个事件而获取一个进程ID。也就是说,程序被触发后,执行者的权限与属性、程序代码与数据等会被加载到内存,操作系统并给予这个内存单元一个标识符(进程ID)。
进程可以使用系统调用fork()来创建一个子进程。子进程获得父进程的数据空间、堆和栈的副本。父进程和子进程并不共享这些存储空间部分,共享正文段,也就是在内存中被标记为只读的程序文本段。例如在Linux shell中键入命令,ps时,shell会创建一个进程,这个子进程执行ps。
kernel@Ubuntu:~/Desktop$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 17637 17627 3 80 0 - 6909 wait pts/1 00:00:00 bash
0 R 1000 17650 17637 0 80 0 - 3554 - pts/1 00:00:00 ps
二、系统调用fork()
1. fork()函数被调用一次,但有两个返回值。父进程返回新创建的子进程ID,子进程返回0。此时的0不是进程ID为0的进程(ID为0的进程通常是调度进程,是内核的一部分,它并不执行任何磁盘上的进程,被称为系统进程)。
实例:
#include <unistd.h>
#include <sys/types.h>
#include "err.h"