文档章节

多进程

时间变
 时间变
发布于 2013/09/02 16:06
字数 1056
阅读 81
收藏 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
    }
}

        未完待续。。。

 

© 著作权归作者所有

共有 人打赏支持
时间变
粉丝 14
博文 3
码字总数 1701
作品 0
海淀
程序员
Python学习,多进程了解一下!学爬虫不会用多进程能行吗?

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

python玩家
08/01
0
0
基于名字自动发布之多进程(3)

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

运维技术
08/21
0
0
Python基础——进程 vs 线程(0526)

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

python初雪之路
05/28
0
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

没有更多内容

加载失败,请刷新页面

加载更多

Flask 开发填坑

插件的选择: flask-security 真的是个鸡肋啊。自带的页面,好丑。还不如用flask-login来做呢。

pearma
50分钟前
2
0
讲述下 :LVM逻辑卷管理遇到的问题

LVM学习逻辑卷管理创建逻辑卷遇到的问题 1 实验环境 系统 内核 发行版本 CentOS 2.6.32-754.2.1.el6.x86_64 CentOS release 6.10 (Final) 由于是最小化安装没有xfs命令,yum安装如下包支持此...

linuxprobe16
今天
1
0
day95-20180922-英语流利阅读-待学习

Hey Jude 半个世纪传唱不衰的背后故事 毛西 2018-09-22 1.今日导读 2004 年,The Beatles 被《滚石》杂志选为“历史上最伟大的 50 位流行音乐家的第一位”。这四名来自英国利物浦的男孩不仅对...

飞鱼说编程
今天
3
0
OSChina 周六乱弹 —— 放假前期焦虑症晚期

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @andonny :分享Matteo的单曲《Panama》: 《Panama》- Matteo 手机党少年们想听歌,请使劲儿戳(这里) @新垣吉衣OSC :我发现只要去有小朋友...

小小编辑
今天
301
10
wait()被notify()后,接着执行wait()后面的语句

wait()被notify()后,接着执行wait()后面的语句

noteman
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部