linux中创建多个子进程的方法

今天,师兄问我一个问题说:小涛啊,创建两个进程太简单了,怎么创建多个进程呢?我说那还不容易,看下边代码:

//省略必要头文件
int main()
{
    pid_t pid[2];
    int i;
    printf("This is %d\n",getpid());
    for(i = 0;i < 2;i++ ){
        if((pid[0] = fork()) < 0){
            printf("Fork() Error!");
            exit(-1);
        }
        if(pid[0] == 0)
            printf("This is parent %d,child is %d\n",getppid(),getpid());
        else
            wait(5);
    }
    return 0;
}
好,这段代码还是挺简单的,我们的意思是:主线程通过循环创建2个子进程,这时系统中的总进程数应该是3,看看输出结果吧:


这下你明白了吧,问题没有想象中的那样简单,父进程现在标号为1的循环中创了一个子进程,然后第二次循环,前边的两个线程个创建一个子进程,这时明显系统中有四个进程,还是不懂?在下边的时序图吧:


这下你应该明白了吧,好了问题知道了,怎么解决,方法有二;

方法一:直接看代码

void createsubprocess(int num)   
{   
    pid_t pid;   
    int i;   
    for(i=0;i<num;i++)   
    {   
        pid=fork();   
        if(pid==0||pid==-1)  //子进程或创建进程失败均退出,这里是关键所在 
        {   
            break;   
        }   
    }   
    if(pid==-1)   
    {   
        perror("fail to fork!\n");   
        exit(1);   
    }   
    else if(pid==0)   
    {   
        printf("子进程id=%d,其对应的父进程id=%d\n",getpid(),getppid());   
        exit(0);   
    }   
    else 
    {   
        printf("父进程id=%d\n",getpid());   
        exit(0);   
    }   
}

这种方法的关键就在于每次循环时,如果发现是子进程就直接从创建子进程的循环中跳出来,不让你进入循环,这样就保证了每次只有父进程来做循环创建子进程的工作。

方法二:直接看代码

void createsubprocess(int num,int max)   
{   
    if(num>=max)return;   
    pid=fork();   
    if(pid<0)   
    {   
        perror("fork error!\n");   
        exit(1);   
    }   
    //子进程   
    else if(pid==0)   
    {   
        sleep(3);   
        printf("子进程id=%d,父进程id=%d\n",getpid(),getppid());   
    }   
    //父进程   
    else 
    {   
        num++;   
        if(num==1)printf("父进程id=%d\n",getpid());   
        if(num<max)createsubprocess(num,max);   
        //此处加sleep是为了防止父进程先退出,从而产生异常   
        sleep(5);   
    }   
}
这里的关键在于递归操作,只有父进程才进入递归创建子进程,子进程不进行这样的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值