Linux多进程编程

    科技2024-11-14  7

     

    1.进程相关概念

    1.1程序和进程

    进程(Process)的定义:

    进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

    进程一个启动的程序,进程占用系统资源。如:物理内存、CPU、终端等,是一个动态的概念。

    在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;

    在当代面向线程设计的计算机结构中,进程是线程的容器。

    程序是指令、数据及其组织形式的描述,进程是程序的实体。程序是指编译好的二进制文件,存储在磁盘中,是一个静态的概念。


    1.2进程的特征

    主要特征:

    动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。并发性:任何进程都可以同其他进程一起并发执行独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进结构特征:进程由程序、数据和进程控制块三部分组成。

    多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。

    1.3进程的状态切换

    进程的基本状态有5种,分别为初始态、就绪态、运行态、挂起态和终止态。

    其中初始态为进程准备阶段,常与就绪态结合来看。

    1.4Linux下进程的结构

    在Linux操作系统中,进程在内存里有三部分的数据,就是“数据段”、“堆栈段”和“代码段”。

    代码段,顾名思义,就是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段。  堆栈段存放的就是子程序的返回地址、子程序的参数以及程序的局部变量。

    数据段则存放程序的全局变量,常数以及动态数据分配的数据空间(比如用malloc之类的函数取得的空间)。

    2.创建进程

    2.1fork函数

    在Linux下产生新的进程的系统调用就是fork函数。fork是最难理解的概念之一:它执行一次却返回两个值。fork函数是Unix系统最杰出的成就之一,它是七十年代UNIX早期的开发者经过长期在理论和实践上的艰苦探索后取得的成果,一方面,它使操作系统在进程管理上付出了最小的代价,另一方面,又为程序员提供了一个简洁明了的多进程方法。与DOS和早期的Windows不同,Unix/Linux系统是真正实现多任务操作的系统,可以说,不使用多进程编程,就不能算是真正的Linux环境下编程。

    函数作用:创建子进程原型: pid_t fork(void);函数参数:无返回值:调用成功:父进程返回子进程的PID,子进程返回0;调用失败:返回-1,设置errno值。

     fork函数代码片段实例

    Parent int main() { pid_t pid; char *message; int n; pid = fork()' if(pid <0){ perror("fork failed"); exit(1); } if(pid == 0) { message = "This is the child\n"; n = 6; } else { message = "This is the parent\n"; n = 3; } for(;n>0;n--){ printf(message); sleep(1); } return 0; }

    fork函数总结

    1.fork函数的返回值?

    父进程返回子进程对的PID,是一个大于0的数。子进程返回0;

    注意:不是fork函数在一个进程中返回2个值,而是在父子进程中各自返回一个值。

    2.子进程创建成功后,代码的执行位置?

    父进程执行到什么位置,子进程就从哪里执行。

    3.如何区分子进程?

    通过fork函数的返回值

    4.父子进程的执行顺序

    不一定,哪个进程抢到CPU,哪个进程就先执行。

     

     

     

     

     

     

     

     

    Processed: 0.030, SQL: 8