现在的位置: 首页 > 综合 > 正文

linux下多进程编程(按照linux C程序员指南的总结)

2013年09月04日 ⁄ 综合 ⁄ 共 1147字 ⁄ 字号 评论关闭

进程的地址空间包括可以 访问或者引用的内存单元的集合。一般通过PC指针来控

制和跟踪进程中的指令,这条指令称为控制点,比较新的UNIX支持多个控制点,这

个控制点也就是线程,多个控制点就叫做多线程。线程存在进程之中。进程是宏观的,线程是微观的。

进程的地址空间往往是虚拟的,往往只有部分映射到物理内存单元上。内核将进程

地址空间中的内容(代码等)保存在各种存储对象上,包括物理内存,磁盘,交换分区等等。

内核的内存管理子系统完成进程的存储页面在这些对象之间的转移。

每个进程还有一组对应于实际的CPU硬件寄存器。将当前运行的进程的寄存器读入

到硬件寄存器中,将其他进程的寄存器保存在每个进程的数据结构中。

每个进程有唯一的进程号PID。

进程表是系统用于描述所有当前装载的进程的一个数据结构,可以用ps来查看他们。

一般来说进程都是由其他进程(称为父进程)启动的,被启动的进程成为自进程。

最早的进程称为init,PID=1。

采用时间片轮转的方法分配CPU在各个进程之间使用。

当一个进程需要调用一个外部命令或者一个程序的时候,需要创建一个子进程。
最简单的方法用system函数,运行shell命令,外部程序(把外部程序的程序名写入

到一个bash脚本文件中,然后在system中运行这个脚本,可以用&使程序在后台运

行)。

用fork创建子进程后,子进程从父进程脱离出去,按照自己的流程去执行。父进程

运行的程序是代码中if(pid)中的代码。公共的代码由父、子进程交替使用CPU的时

间。如果这块公共代码父进程执行完了,那么父进程使用CPU时间时,继续往下执

行。
有的时候父进程结束了,子进程还没有结束,可以在后面的if(pid)中用wait()挂

起,等待子进程结束才开始执行wait()以及下面的代码。
详见p204的例子。
fork的一个基本结构:
pid=fork();
switch(pid)
{
 case -1;
  exit(1);
 case 0: //子进程
  。。。。(主要是子进程中的变量设置)
 default://父进程
  。。。。(主要是父进程中的变量设置)
}

。。。//公共代码段,此处父子进程交替使用CPU时间。

if(pid)
{
 wait();//等待子进程结束
 。。//最后父进程退出
}

僵尸进程会占用proc结构,因而会减少处于活动状态的进程总数。子进程退出之后

,父进程清除它之前,它一直处于僵尸状态,在这个状态下,它所保留的唯一的资

源就是proc结构。父进程调用wait来释放该proc结构。
如果父进程先于子进程退出,init进程会领养子进程,清除proc结构。
但是如果子进程先于父进程退出,但是父进程没有调用wait()函数,子进程的proc

结构将不会被释放,子进程保持僵尸状态并占有proc结构,直到系统重启。

 

 

抱歉!评论已关闭.