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

相关推荐
keyipatience23 分钟前
7.Linux1权限-开发工具
linux
j_xxx404_1 小时前
万字长文爆肝:彻底弄懂Linux文件系统(Ext2),从Inode、Block到Dentry核心机制全解析
linux·运维·服务器
2401_841495642 小时前
Linux C++ TCP 服务端经典的监听骨架
linux·网络·c++·网络编程·ip·tcp·服务端
楼田莉子2 小时前
同步/异步日志系统:日志器管理器模块\全局接口\性能测试
linux·服务器·开发语言·c++·后端·设计模式
奇妙之二进制2 小时前
zmq源码分析之io_thread_t
linux·服务器
cui_ruicheng2 小时前
Linux IO入门(三):手写一个简易的 mystdio 库
linux·运维·服务器
telllong2 小时前
MCP协议实战:30分钟给Claude接上你公司的内部API
linux·运维·服务器
实心儿儿3 小时前
Linux —— 进程概念 - 程序地址空间
linux·运维·算法
buhuizhiyuci3 小时前
linux篇-应用商店:“yum / apt“ 的详解
linux·运维·服务器
零号全栈寒江独钓3 小时前
基于c/c++实现linux/windows跨平台ntp时间戳服务器
linux·c语言·c++·windows