怎么样在linux下进行多进程编程?
进程的地址空间包括可以 访问或者引用的内存单元的集合。一般通过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结构,直到系统重启。
本文地址:http://www.45fan.com/dnjc/68241.html