linux多进程介绍和示例

 

进程的概念

        什么是进程?进程这个概念是针对系统而不是针对程序员的,对程序员来说,我们面对的概念是程序。当程序员敲入命令执行一个程序的时候,对系统而言,它将启动一个进程。进程就是正在内存中运行中的程序。

        Linux下一个进程在内存里有三部分的数据,就是“代码段”、”堆栈段”和”数据段”。”代码段”,顾名思义,就是存放了程序代码。“堆栈段”存放的就是程序的返回地址、程序的参数以及程序的局部变量。而“数据段”则存放程序的全局变量,常数以及动态数据分配的数据空间(比如用new函数分配的空间)。

        系统如果同时运行多个相同的程序,它们的“代码段”是相同的(因为代码是已经固定不变的),“堆栈段”和“数据段”是不同的(相同的程序,处理的数据不同)。 

进程的编号

1、查看进程

        ps 查看当前终端的进程

      

        ps -ef 查看系统全部的进程。

        ps -ef |more 查看系统全部的进程,结果分页显示。

      

        UID    :启动进程的操作系统用户。

        PID    :进程编号。

        PPID   :进程的父进程的编号。

        C          :CPU使用的资源百分比。

        STIME :进程启动时间。

        TTY     :进程所属的终端。

        TIME   :使用掉的CPU时间。

        CMD   :执行的是什么指令。

        ps -ef |grep book查看系统全部的进程,然后从结果集中过滤出包含“book”单词的记录。程序员用得最多的指令就是这个了。

      

2、getpid库函数

        getpid库函数的功能是获取本程序运行时进程的编号。

        包含头文件:

                #include <sys/types.h>

                #include <unistd.h>

        函数声明:

                pid_t getpid(void);

        函数没有参数,返回值是进程的编号,pid_t就是typedef int pid_t。

        示例

      

      

      

        sleep(30)是为了方便查看进程。

        注意两个细节:

        1)进程的编号是系统动态分配的,相同的程序在不同的时间执行,进程的编号是不同的。

        2)进程的编号会循环使用,但是,在同一时间,进程的编号是唯一的,也就是说,不管任何时间,系统不可能存在两个编号相同的进程。

多进程

        fork在英文中是“分叉”的意思。为什么取这个名字呢?因为一个进程在运行中,如果使用了fork函数,就产生了另一个进程,于是进程就“分叉”了,所以这个名字取得很形象。下面就看看如何具体使用fork函数,这段程序演示了使用fork的基本框架。

        函数声明:

                pid_t fork(void);

        fork函数用于产生一个新的进程,函数返回值pid_t是一个整数,在父进程中,返回值仍为进程编号,在子进程中,返回值是0。

        

        运行结果

        

        查看进程情况,出现了两个book进程。

        

        初学者可能用点接受不了现实。

        1)一个函数(fork)返回了两个值?

        2)if和else中的代码能同时被执行?

        那么调用这个fork函数时发生了什么呢?fork函数创建了一个新的进程,新进程(子进程)与原有的进程(父进程)一模一样。子进程和父进程使用相同的代码段;子进程拷贝了父进程的堆栈段和数据段。子进程一旦开始运行,它复制了父进程的一切数据,然后各自运行,相互之间没有影响。

        fork函数对返回值做了特别的处理,调用fork函数之后,在子程序中fork的返回值是0,在父进程中fork的返回值仍是原进程的编号,程序员可以通过fork的返回值来区分父进程和子进程,然后再执行不同的代码。

        示例

      

        运行结果

      

        在上文上已提到过,子进程拷贝了父进程的堆栈段和数据段,也就是说,在父进程中定义的变量子进程中会复制一个副本,fork之后,子进程对变量的操作不会影响交父进程,父进程对变量的操作也不会影响子进程,示例:

      

        运行结果:

      

 

版权声明

C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。

来源:C语言技术网(www.freecplus.net

作者:码农有道

如果这篇文章对您有帮助,请点赞支持,或在您的博客中转发我的文章,谢谢!!!

如果文章有错别字,或者内容有误,或其他的建议或意见,请您留言指正,非常感谢!!!

 

 

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C语言技术网-码农有道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值