LinuxC系统编程中的进程介绍先决条件进程是一个正在运行的程序的例子。当我们在磁盘上运行程序时,会创建一个进程。与程序不同,进程是一个动态的概念。进程不仅包括程序执行的代码,还包括程序执行过程中产生的数据、打开的文件、堆、栈等。程序是一个无生命的实体。只有处理器赋予了程序生命,它才能成为一个活跃的实体。我们称之为过程。——摘自百度百科操作系统管理流程事实上,单核CPU同时只能执行一条指令。为了达到“同时”运行多个程序的效果,操作系统采用的方法是:使用一些算法让CPU在不同的进程间切换,让每个进程都能使用CPU一段时间。由于CPU在不同进程之间切换的速度非常快,用户很难察觉,给用户一种“同时”运行多个程序的错觉。李志军老师的操作系统课上有一个非常贴切的比喻。如果你现在正在读小说,有人在敲门。你放下书去开门,然后回来继续看书。在你回来继续阅读之前,你会在脑海中还原上一篇小说中的场景,然后继续阅读。我们来介绍一下PCB。PCB(ProcessControlBlock过程控制单元)PCB记录了程序运行过程中的一些信息。结合上面的例子,如果看小说是一个程序,程序开始运行,生成一个进程。在阅读小说的过程中,脑海中会浮现出小说故事中的一些场景。当你转身做其他事情回来看小说时(从其他进程切换过来),你需要还原之前的场景,提前知道我之前看到的是哪一段,现在想从之前的进度继续读下去.PCB记录了这样的信息,方便CPU在进程切换时恢复之前的执行状态。PCB记录的信息如下,仅供理解:进程标识符(内部、外部)处理器信息(通用寄存器,指令计数器、PSW、用户的堆栈指针)。进程调度信息(进程状态、进程优先级、进程调度所需的其他信息、事件)进程控制信息(程序数据地址、资源列表、进程同步和通信机制、链接指针)系统在Linux中与进程相关的调用fork的函数fork的意思是在已有进程的基础上复制一个新的进程。调用fork的进程称为父进程,新创建的进程为子进程。子进程是父进程的副本。父进程和子进程除了进程的id,即pid(一个用来标识进程的数字,全局唯一)之外是相同的。有趣的是,它与一般函数不同。一般函数调用返回一次,fo??rk函数返回两次。父进程返回一次,子进程返回一次。在父进程中,fork函数返回子进程的pid;在子进程中,fork函数返回0(如果新进程失败则为-1)。请看下面的代码和结果体验。intpid=fork();if(pid==0){printf("我是子进程\n");}elseif(pid>0){printf("我是父进程,子进程的pid=%d\n",pid);}else//pid==-1{printf("Error\n");}输出结果:我是父进程,子进程的pid=106383我是a子进程又可能长出这个样子(顺序变了):我是子进程,我是父进程,子进程的pid是106383。调用fork后,有两个进程,这两个进程会继续执行。前面说过,CPU是在不同的进程中切换运行的,所以顺序取决于操作系统如何调度CPU。可能第一次跑就是前者的情况,第二次跑就变成了后一种情况。待续...
