linux创建子进程

本文介绍了在Linux系统中创建子进程的三种方法:fork创建单个和多个子进程,以及vfork创建子进程。vfork特性在于它先执行子进程,子进程调用exec或exit后父进程才会继续执行,且在子进程调用exec前,vfork会在父进程的地址空间运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建子进程方法

fork创建单个子进程

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(int argc, char *argv[])
{
    int var = 10;
    pid_t pid;
    //创建子进程,如果返回-1则失败,如果返回0则子进程,返回正数是父进程,
    //并且他们有独立的空间
    //子进程继承父进程的缓冲区
    //如果子进程结束,不写wait则子进程是僵尸进程
    //如果父进程结束子进程没有结束则是孤儿进程
    pid = fork();
    if(pid == -1)
    {
        perror("for");
        return 0;
    }
    else if(pid == 0)
    {
        while(1)
        {
            printf("子进程:xxx!\n");
            printf("%d\n", var);
            sleep(1);
        }
    }
    else if(pid > 0)
    {
        while(1)
        {
            printf("父进程:XXX!\n");
            printf("%d\n", var);
            sleep(1);
        }
    }

    return 0;
}

fork创建多个子进程

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(int argc, char *argv[])
{
    int var = 10;
    pid_t pid, pid2;
    //创建两个子进程的方法
    //for(i = 0; i < 5; i++) pid = fork();创建31个子进程
    pid = fork();
    if(pid == -1)
    {
        perror("for");
        return 0;
    }
    else if(pid == 0)
    {
        
    }
    else if(pid > 0)//父进程
    {
        pid2 = fork();
        if(pid2 == -1)
        {
            perror("for");
            return 0;
        }
        else if(pid2 == 0)
        {
            
        }
        else if(pid2 > 0)
        {
            
        }
    }

    return 0;
}

vfork创建子进程

//vfork先执行子进程,当子进程调用exec或exit后才执行父进程
//vfork在子进程调用exec之前在父进程地址运行,之后在子进程地址运行
//子进程执行之前父进程挂起

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int var = 0;

int main(int argc, char *argv[])
{
    pid_t pid;
    int num = 0;
 
    pid = vfork();
    if(pid == -1)
    {
        perror("vfork");
    }
    else if(pid == 0)
    {
        int i = 0;
        for(i = 0; i < 3; i++)
        {
            printf("은.\n");
        }
        _exit(0);
    }
    else if(pid > 0)
    {
        int i = 0;
        for(i = 0; i < 3; i++)
        {
            printf("인.\n");
            sleep(1);
        }
    }

    return 0;
}

获得进程号

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
//查看进程号
int main(int argc, char *argv[])
{
    
    pid_t pid, ppid, pgid;
    pid = getpid();
    ppid = getppid();
    pgid = getpgid(pid);
    printf("pid = %d\n", pid);
    printf("ppid = %d\n", ppid);
    printf("pgid = %d\n", pgid);
    printf("我的理想");
    return 0;
}

执行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值