进程控制编程

来源:互联网 发布:热力学计算软件共同点 编辑:程序博客网 时间:2024/05/29 18:30

Linux进程概述:

  Linux是一个多人的操作系统,也就是在同一时间,可以有多个进程同时执行。那么Linux是如何实现多进程控制的呢,它是使用了一个称谓“进程调度”的手段。程序是静态的,它是一些保存在磁盘上的指令的有序集合;而进程是一个动态的概念,它是一个运行着的程序,包含了进程的动态创建、调度和消亡的过程,是Linux的基本调度单位那么从系统的角度看如何描述并表示它的变化呢?在这里,是通过进程控制块(PCB)来描述的。进程控制块包含了进程的描述信息、控制信息以及资源信息,它是进程的一个静态描述。内核使用进程来控制对CPU和其他系统资源的访问,并且使用进程来决定在CPU上运行哪个程序,运行多久以及采用什么特性运行它。内核的调度器负责在所有的进程间分配CPU执行时间,称为时间片(time slice),它轮流在每个进程分得的时间片用完后从进程那里抢回控制权。

Linux进程的组成以及创建进程:

Linux进程是由那些组成的?

Linux中一个进程由三部分组成:代码段,数据段,堆栈段

从内存的低地址到高地址依次为:

代码段:二进制机器代码

数据段:存储已被初始化的变量,包括全局变量和已被初始化的静态变量

未初始化数据段:存储未被初始化的静态变量,又称BBS

堆:用于存放程序运行中动态分配的变量

栈:用于函数调用,保存函数的返回地址,函数的参数,函数内部定义的局部变量

Linux下程序是如何转化为进程的呢?

内核将程序读入内存,为程序分配内存空间

内核为该进程分配进程标识符pid和其他所需资源

内核为该进程保存PID及相应的状态信息,把进程放到运行队列中等待执行.程序转化为进程后就可以被操作系统的调度程序调度执行了

如何创建一个进程

Linux下有四类创建子进程的函数:system(),fork(),exec*(),popen()

system函数通过调用shell程序/bin/sh –c来执行string所指定的命令,该函数在内部是通过调用execve(“/bin/sh”,..)函数来实现的。通过system创建子进程后,原进程和子进程各自运行,相互间关联较少。如果system调用成功,将返回0

在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。它和其他函数的区别在于:它执行一次返回两个值。其中父进程的返回值是子进程的进程号,而子进程的返回值为0.若出错则返回-1.因此可以通过返回值来判断是父进程还是子进程。

fork函数创建子进程的过程为:

使用fork函数得到的子进程是父进程的一个复制品,它从父进程继承了进程的地址空间,包括进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端,而子进程所独有的只有它的进程号、资源使用和计时器等。通过这种复制方式创建出子进程后,原有进程和子进程都从函数fork返回,各自继续往下运行,但是原进程的fork返回值与子进程的fork返回值不同,在原进程中,fork返回子进程的pid,在子进程中,fork返回0,如果fork返回负值,表示创建子进程失败

exec函数创建过程:

exec函数族的工作过程与fork完全不同,fork是在复制一份原进程,而exec函数是用exec的第一个参数指定的程序覆盖现有进程空间(也就是说执行exec族函数之后,它后面的所有代码不在执行)。

path是包括执行文件名的全路径名。arg是可执行文件的命令行参数,多个用,分割注意最后一个参数必须为NULL

popon函数创建过程:

command为可执行文件的全路径和执行参数;type可选参数为”r”或”w”,如果为w”,popen返回的文件流做为新进程的标准输入流,即stdin,如果为r”,popen返回的文件流做为新进程的标准输出流如果type是“r”,(即command命令执行的输出结果作为当前进程的输入结果)。被调用程序的输出就可以被调用程序使用,调用程序利用popen函数返回的FILE*文件流指针,就可以通过常用的stdio库函数(如fread)来读取被调用程序的输出;如果tpye是“w”,(即当前进程的输出结果作为command命令的输入结果)。调用程序就可以用fwrite向被调用程序发送数据,而被调用程序可以在自己的标准输入上读取这些数据。pclose等待新进程的结束,而不是杀新进程






原创粉丝点击