文档章节

多进程

时间变
 时间变
发布于 2013/09/02 16:06
字数 1056
阅读 99
收藏 1

 

    最近用到多进程和多线程的任务,做此记录以便自己知识的巩固吧。

    linux中多进程中最重要的函数就是fork了,此函数的功能是创建一个子进程,这个函数很奇怪,因为它有两个返回值,一个返回值是0,一个是非0正值。也正因为有了这两个值,才可以使我们可以区分父子进程。返回值为0的进程为子进程,非0值的进程是父进程,并且这个非0值就是他儿子的id号。当然还有可能返回一个-1,那么此时就是创建进程时发生了错误。

    多进程编程中还有很多重要的函数,比如getpid, getppid, wait, waitpid等函数。我只列出了自己用到的,没用到的应该也很重要。getpid函数是返回调用进程的id号,其实一个main函数就是一个主进程,你可以在这个函数中调用一下getpid函数来看一下它的id号。getppid函数是得到父进程的id号,比如说一个子进程,想知道自己的生父是谁,那么就调用一下getppid(),那么就知道它的生父的id号了。wait和waitpid函数是父进程用来回收资源使用的。多进程中通常存在一个僵尸进程的问题。什么是僵尸进程呢?僵尸进程就是当一个子进程结束了,但是它的父进程没有等待它,也就是没有回收它的资源,通俗点就是这个孩子还太小不会擦屁股,当孩子解决完生理问题后需要父亲来给它擦屁股,但是这个父亲却不是一个合格的父亲,直接和孩子断了联系,不管孩子了,那么这个孩子子进程就变成了僵尸进程。因此一个合格的父亲必须得wait或者waitpid,具体的函数参数和返回值可以去查文档。wait函数的意思是用来等待“一个”子进程结束,并来处理后事,这样父进程就是个合格的父亲了。前面我对一个加了引号,这是为了说明一下:如果一个父进程有很多个子进程,那么wait函数当被通知到有其中的任何一个孩子结束时,父进程就可以返回了,其他的孩子它就不管了(哎,好像还是个不合格的父亲)。在父进程中调用wait或者waitpid可能会发生三种情况:1.父亲的所有孩子都还在运行,那么父亲就会一直阻塞,而不会退出。2.当孩子中有一个孩子终止了,那么父亲就得到它的终止状态,那么父亲的义务就完成了。3.如果父进程没有一个子进程,那么就会报错。上面说到父进程只管处理其中一个子进程,那么其他的孩子怎么办呢?会不会变成僵尸进程呢?答案是:不会!因为当任何一个进程结束时,系统就会扫描一下所有的进程,看一下会不会有这个进程孩子还在系统中跑着玩,如果发现有,那么系统就将这些孩子全部过继给了Init进程,成为它们的父进程。Init进程的id号始终是1,你可以编写个测试程序试一下:

    

int main()
{
    pid_t pid;
    pid = fork();
    if(pid == 0)
    {
        if(-1 == pid)
        {
            fprintf(stderr,"error!\n");
            exit(0);
        }
        else if(0 == pid)
        {
             printf("I am a child! I must sleep 10 seconds!\n");
             sleep(10);
             exit(0);
        }
         else
         {
             printf("I am a father! I must exit immediately!\n");
             exit(0);
         }
    }
}


gcc test.c
ps -ef | grep a.out
       运行ps就可以看到它的父进程的id为1。    

        关于一个父进程产生多个子进程的问题,这个可以用一个for循环来产生多个并列的子进程。

int main()
{
    pid_t pid;
    int i;
  
    for(i = 0; i < 5; i++)
    {
        pid = fork();
        if(pid == 0 || pid == -1)
           break;
    }

    if(pid == -1)
    {
        fprintf(stderr,"error!\n");
        exit(-1);
    }
    else if(pid == 0)
    {
        // child process to do something
    }
    else
    {
        // father process to do something
    }
}

        未完待续。。。

 

© 著作权归作者所有

共有 人打赏支持
时间变
粉丝 16
博文 3
码字总数 1701
作品 0
海淀
程序员
私信 提问
基于名字自动发布之多进程(3)

基于名字自动发布之多进程(3) 项目地址: https://gitee.com/lookingdreamer/RexDeployv1 流程图 为什么选择多进程? 随着应用越来越多,单进程的运行已经严重的拖慢了速度.所以多进程就应运而...

运维技术
08/21
0
0
Python 进程、进程通信 进程池

一:多进程的优点、应用场景 耗CPU计算时多进程速度大于多线程,可以最大化利用CPU计算。多进程有更强的容错性,一个进程出错不会影响其他进程。通常不需要考虑锁和同步资源的问题。 二:进程...

rieuse
09/20
0
0
Python学习,多进程了解一下!学爬虫不会用多进程能行吗?

python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,P...

python玩家
08/01
0
0
Python基础——进程 vs 线程(0526)

一、实现多任务最常用的两种方法:多线程和多进程 二、要实现多任务,通常我们会设计 Master-Worker 模式,其中Master 负责分配任务,Worker负责执行任务。因此多任务环境下,通常是一个Mas...

python初雪之路
05/28
0
0
分布式爬虫笔记(二)- 多线程&多进程爬虫

这一次分析主要是针对上 分布式爬虫笔记(一)- 非框架实现的Crawlspider 的一次改进,从单机的爬虫改成多线程和多进程爬虫~~~ 多线程和多进程的区别 参考文章 单线程、多线程和多进程的效率...

Spareribs
2017/07/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

DataFrames中的reindex用法

from pandas import DataFrame frame = DataFrame(np.arange(9).reshape((3,3)),index=['a','c','d'],columns=['Ohio','Texas','California'] states = ['Texas','Utah','California'] frame......

卖小孩的小火柴
13分钟前
0
0
拜托!面试请不要再问我Spring Cloud底层原理

毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术。不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓。因此本...

James-
13分钟前
1
0
Shiro框架

提供了认证,授权,加密,会话管理等功能 在spring配置文件中配置shiro,需要配置的有shiro的过滤器工厂,在里面我们可以配置什么页面需要认证,什么认证不需要认证,认证成功后跳转的路径,认证失败...

tinder_boy
16分钟前
0
0
有关定时任务的表达式--cron 详细解

Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: Seconds Minutes Hours DayofMonth Month DayofWeek Year或 Seconds Minu...

kuchawyz
18分钟前
1
0
下一代大数据处理引擎,阿里云实时计算独享模式重磅发布

11月14日,阿里云重磅发布了实时计算独享模式,即用户独享一部分物理资源,这部分资源在网络/磁盘/CPU/内存等资源上跟其他用户完全独立,是实时计算在原有共享模式基础上的重大升级。 (观看...

阿里云云栖社区
18分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部