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

相关推荐
A小辣椒2 天前
TShark:Wireshark CLI 功能
linux
A小辣椒2 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao3 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334663 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪3 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush44 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5204 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩4 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言