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

相关推荐
默|笙6 小时前
【Linux网络】网络层协议 IP(1)理解报头、网段划分
linux·网络·tcp/ip
修己xj9 小时前
nslookup 使用指南:两种模式与常用查询技巧
linux
唠玖馆11 小时前
文件系统详解
linux·文件系统·ext2
GeW11 小时前
当Linux内核开始“确定性”,制造高端化才有了底层语法
linux
星恒随风12 小时前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
StarsGreen14 小时前
libva在intel平台上的前端流程简介
linux
坤坤子吖17 小时前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json
Felven19 小时前
华为鲲鹏920s芯片serdestool工具使用说明
linux·运维·服务器·华为·鲲鹏920·serdestool
莫晓燚19 小时前
mall 电商项目完整部署---实战
linux·运维·docker·容器
咋的啥名都用不了呢~19 小时前
Linux项目部署5(安装Nginx的插件)
linux