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得以保留

相关推荐
消失的旧时光-19439 分钟前
C语言对象模型系列(四)《Linux 内核里的 container_of 到底是什么黑魔法?》—— 一篇讲透 Linux 内核的“对象模型”核心技巧
linux·c语言·算法
SWAGGY..36 分钟前
Linux系统编程:(二)基础指令详解
linux·运维·服务器
kdxiaojie1 小时前
U-Boot分析【学习笔记】(3)
linux·笔记·学习
烛衔溟1 小时前
TypeScript 接口继承与混合类型
linux·ubuntu·typescript
蜡笔婧萱2 小时前
Linux--远程登录服务ssh
linux·服务器·ssh
伏加特遇上西柚2 小时前
Loki+Alloy+Grafana日志采集部署
java·linux·服务器·spring boot·grafana·prometheus
资源分享助手2 小时前
三网H5小游戏战车向前冲搭建教程(Win+Linux)
linux·运维·服务器
黑白园2 小时前
Linux i2c驱动初探(一)待补充
linux
无限进步_2 小时前
Linux权限模型:从rwx到粘滞位
linux·运维·服务器
SWAGGY..3 小时前
Linux系统编程:(一)基础指令详解
linux·运维·服务器