linux——创建进程

vfork也可以创建进程,与fork有什么区别呢?

区别一:vfork可以直接使用父进程存储空间,不拷贝

区别二:vfork可以保证子进程先运行,当子进程调用exit退出后,父进程才执行

复制代码
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include<stdlib.h>

int main()
{
        pid_t pid;
        pid = fork();
        if(pid>0)
        {
                while(1)
                {
                        printf("parent process pid is %d\n",getpid());
                        sleep(1);
                }
        }
        else if(pid == 0)
        {
                while(1)
                {
                        printf("child process pid is %d\n",getpid());
                        sleep(1);
                }
        }

        return 0;
}
复制代码
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include<stdlib.h>

int main()
{
        pid_t pid;
        pid = vfork();
        if(pid>0)
        {
                while(1)
                {
                        printf("parent process pid is %d\n",getpid());
                        sleep(1);
                }
        }
        else if(pid == 0)
        {
                while(1)
                {
                        cnt++;
                        printf("child process pid is %d\n",getpid());
                        sleep(1);
                }
        }

        return 0;
}

原理:

  • fork 创造一个独立的子进程

  • 父子谁先跑、谁后跑、谁跑得多,看系统调度

  • 父子互不干扰,并行运行

  • vfork = 子进程先跑,父进程必须等子进程结束才能跑!

  • vfork 创建的子进程共享父进程地址空间

  • 父进程会被阻塞,直到子进程退出或执行 exec

  • 子进程不退出 → 父进程永远卡住!

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

    int main()
    {
    pid_t pid;
    int cnt = 0;
    pid = vfork();
    if(pid>0)
    {
    while(1)
    {
    printf("cnt = %d\n",cnt);
    printf("parent process pid is %d\n",getpid());
    sleep(1);
    }
    }
    else if(pid == 0)
    {
    while(1)
    {
    cnt++;
    printf("child process pid is %d\n",getpid());
    sleep(1);
    printf("cnt is %d\n",cnt);
    if(cnt == 3)
    {
    break;
    }
    }
    }

    复制代码
          return 0;

    }

子进程在break和return后结束了,父子共用的栈被销毁了,所以父进程打印的cnt的值是随机数

复制代码
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include<stdlib.h>

int main()
{
        pid_t pid;
        int cnt = 0;
        pid = vfork();
        if(pid>0)
        {
                while(1)
                {
                        printf("cnt = %d\n",cnt);
                        printf("parent process pid is %d\n",getpid());
                        sleep(1);
                }
        }
        else if(pid == 0)
        {
                while(1)
                {
                        cnt++;
                        printf("child process pid is %d\n",getpid());
                        sleep(1);
                        printf("cnt is %d\n",cnt);
                        if(cnt == 3)
                        {
                                exit(0);
                        }
                }
        }

        return 0;
}

子进程正常退出,不会破坏父子共享的栈结构,cnt = 3得以保留

相关推荐
夜听莺儿鸣8 小时前
502-002_Linux驱动开发模块化编程
linux·驱动开发·模块化编程
wuminyu9 小时前
C++协程实现接收端的零拷贝Buffer管理原理剖析
java·linux·c语言·jvm·c++
科力锐品牌君10 小时前
应用级灾备 | 海量非结构化数据如何实现高效数据保护
linux·运维·网络·安全·系统安全·数据安全·灾备
zhangrelay10 小时前
ROS项目设计案例智能大模型正经乱答案例
linux·笔记·学习·ubuntu·机器人
流浪00111 小时前
Linux系统篇39——线程(四) pthread库的由来和线程的创建与等待
linux·操作系统·线程·pthread库
Lancker11 小时前
chnroute-linux — 中国大陆 IP 段每日自动更新 + 「仅允许国内访问」落地
linux·运维·tcp/ip
高山有多高11 小时前
【Linux笔记】Linux进程与守护进程
linux
大侠归来12 小时前
Ubuntu 搭建 APUE 环境:从源码编译到第一个示例跑通
linux·运维·ubuntu
shdkfbbv13 小时前
【无标题】
linux·运维·服务器
周洲083014 小时前
STM32片内Flash读写深度详解|掉电参数保存、底层原理
linux·前端·stm32