文档章节

多进程

时间变
 时间变
发布于 2013/09/02 16:06
字数 1056
阅读 79
收藏 1
点赞 0
评论 0

 

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

    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
    }
}

        未完待续。。。

 

© 著作权归作者所有

共有 人打赏支持
时间变
粉丝 14
博文 3
码字总数 1701
作品 0
海淀
程序员
Python基础——进程 vs 线程(0526)

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

python初雪之路
05/28
0
0
php多进程处理

php多进程处理 往往我们会碰到一个情况,需要写一个脚本,这个脚本要处理的数据量极大,单进程处理脚本非常慢,那么这个时候就会想到使用多进程或者多线程的方式了。 我习惯使用多进程的方式...

蜗牛奔跑
2016/11/15
3
0
进程VS.线程-笔记

资料来源: http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001397567993007df355a3394da48f0bf14960f0c78753f000 1、Apache最早就是采用多进程模式 ......

hiqj
2015/07/17
76
0
Mozilla Firefox Nightly 版默认启用多进程

Firefox朝着正式支持多进程架构迈出了一大步:它的Nightly版开始默认启用多进程。Firefox的竞争对手IE和Chrome都支持多进程,每个标签一个进程的设计有助于改进浏览器的稳定性,一个标签挂起...

oschina
2015/05/18
2.3K
25
Perl 多进程技术在自动化测试中的应用

在 IT 产品系统测试的自动化项目中,经常有并行处理多个子任务的需求,为了提高测试效率,就需要用到多进程或者多线程编程。文章介绍了 Perl 多进程的用法和适用场景,以及 Perl 多进程和多线...

红薯
2009/12/02
747
0
36. Python 多进程

多进程概念: 进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是死的(静态的),进程是活的(动态的)。进程可以分为系统进程和用户进程。凡是用于完成...

ln286577399
2017/12/08
0
0
node 多线程 cluster

上篇 Node.js 诞生之初就遭到不少这样的吐槽,当然这些都早已不是问题了。 1、可靠性低。 2、单进程,单线程,只支持单核 CPU,不能充分的利用多核 CPU 服务器。一旦这个进程崩掉,那么整个 ...

fymoon
2016/10/30
27
0
记忆模糊的知识点5-23

多进程 Unix/Linux操作系统提供了一个系统调用 windows 不能使用 由于Python是跨平台的,自然也应该提供一个跨平台的多进程支持。模块就是跨平台版本的多进程模块。 模块提供了一个类来代表一...

mrzengqq
2017/05/26
0
0
python并行处理任务时 该用多进程?还是该用多线程?

在python并行处理任务时要使用多线程还是多进程? 说到这个话题,必须要提的GIL( Global Interpreter Lock)全局解释锁,当Cpython每次执行字节码时都要先申请这个锁。那么问题就来了,如果使...

david_bj
2015/07/10
0
0
分布式爬虫笔记(二)- 多线程&多进程爬虫

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

Spareribs
2017/07/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

实现服务启动之后,马上执行任务的几种方法

有哪些方法 实现服务启动之后,马上执行相关操作? 方式一 :@PostConstruct 对类的要求 无,普通的java bean即可 例如: /*** * 执行完构造方法之后就会执行该方法 */@PostConstruc...

黄威
15分钟前
0
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

六库科技
58分钟前
0
0
牛客网刷题

1. 二维数组中的查找(难度:易) 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入...

大不了敲一辈子代码
今天
0
0
linux系统的任务计划、服务管理

linux任务计划cron 在linux下,有时候要在我们不在的时候执行一项命令,或启动一个脚本,可以使用任务计划cron功能。 任务计划要用crontab命令完成 选项: -u 指定某个用户,不加-u表示当前用...

黄昏残影
昨天
0
0
设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
昨天
0
0
《Linux Perf Master》Edition 0.4 发布

在线阅读:https://riboseyim.gitbook.io/perf 在线阅读:https://www.gitbook.com/book/riboseyim/linux-perf-master/details 百度网盘【pdf、mobi、ePub】:https://pan.baidu.com/s/1C20T......

RiboseYim
昨天
1
0
conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
昨天
1
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
昨天
0
0
非常实用的IDEA插件之总结

1、Alibaba Java Coding Guidelines 经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的《阿里巴巴Java开发规约》扫描插件!该插件由阿里巴巴P3C项目组研发。P3C...

Gibbons
昨天
1
0
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口

Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 java程序写的网站用tomcat+jdk来运行...

TaoXu
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部