zoukankan      html  css  js  c++  java
  • Linux之创建多个子进程

    /***
    fork_test.c
    ***/
    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    
    int main()
    {
        pid_t pid;
        printf("xxxxxxxx
    ");
        
        pid = fork();
        if(-1 == pid)
        {
            perror("fork error:");
            exit(1);    
        }
        else if(pid == 0)
        {
            printf("I'm child,pid = %u,ppid = %u
    ",getpid(),getppid());
        }
        else
        {
            printf("I'm parent,pid = %u, ppid = %u
    ",getpid(),getppid());
            sleep(1);
        }
        printf("YYYYYYYYYYY
    ");
        return 0;
    }

    运行结果:

    ubuntu1604@ubuntu:~/wangqinghe/C/20190805$ ./fork_test

    xxxxxxxx

    I'm parent,pid = 2610, ppid = 2558

    I'm child,pid = 2611,ppid = 2610

    YYYYYYYYYYY

    YYYYYYYYYYY

    循环创建N个子进程:

    使用for循环创建五个子进程:

    /***
    fork_test.c
    ***/
    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    
    int main()
    {
        int i;
        pid_t pid;
        printf("xxxxxxxx
    ");
        
        for(i = 0; i < 5; i++)
        {
            pid = fork();
            if(-1 == pid)
            {
                perror("fork error:");
                exit(1);    
            }
            else if(pid == 0)
            {
                printf("I'm child,pid = %u,ppid = %u
    ",getpid(),getppid());
            }
            else
            {
                printf("I'm parent,pid = %u, ppid = %u
    ",getpid(),getppid());
                sleep(1);
            }
        }
        printf("YYYYYYYYYYY
    ");
        return 0;
    }

    运行程序后却创建了2^5-1个子进程。

    问题分析:

    问题解决:

    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    
    int main()
    {
        int i;
        pid_t pid;
        printf("xxxxxxxx
    ");
        
        for(i = 0; i < 5; i++)
        {
            pid = fork();
            if(pid == 0)
            {
                break;
            }
        }
    
        if(i < 5)
        {
            sleep(i);
            printf("I'm %d child,pid = %u
    ",i+1,getpid());
    
        }
        else
        {
            sleep(i);
            printf("I'm parent
    ");
    
        }
        return 0;
    }

    在子进程pid == 0 时直接break出来就好了。

    运行结果:

    ubuntu1604@ubuntu:~/wangqinghe/C/20190805$ make fork_test

    gcc fork_test.c -o fork_test -Wall -g

    ubuntu1604@ubuntu:~/wangqinghe/C/20190805$ ./fork_test

    xxxxxxxx

    I'm 1 child,pid = 3157

    I'm 2 child,pid = 3158

    I'm 3 child,pid = 3159

    I'm 4 child,pid = 3160

    I'm 5 child,pid = 3161

    I'm parent

  • 相关阅读:
    使用Redux管理你的React应用(转载)
    基于webpack使用ES6新特性(转载)
    在SublimeText上搭建ReactJS开发环境(转载)
    Javascript 严格模式详解
    HTML5探秘:用requestAnimationFrame优化Web动画
    requestAnimationFrame,Web中写动画的另一种选择
    Gulp自动添加版本号(转载)
    一小时包教会 —— webpack 入门指南
    React 入门实例教程(转载)
    走向视网膜(Retina)的Web时代
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11317403.html
Copyright © 2011-2022 走看看