Linux -- 进程管理之fork() 函数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chen892704067/article/details/52861945

for(int i = 0; i<2; i++)
{
    if(fork() == 0)
        printf("A\n");
    else
        printf("B\n");
}



for(int i = 0; i<2; i++)
{
    if(fork() == 0)
        printf("A");
    else
        printf("B");
}

该循环中打印没有字符 "\n",无法刷新缓冲区
每一次fork()会复制之前进程中缓冲区的字符
最后执行结果为BBBAABAA


if(fork() && fork())
        printf("A\n");
    else
        printf("B\n");

该if块中第一个fork()生成一个子进程,返回0,所以第二个fork()不会执行
父进程返回pid,执行第二个fork(),再次产生一个子进程
所以最终printf调用了三次
最后执行结果为
A
B
B


#include <stdio.h>
#include <stdlib.h>

void f0()
{
    int tmp = 0;
    int pid = fork();
    if(pid == 0)
    {
        tmp++;
        printf("son\n");
    }
    else if(pid > 0)
    {
        printf("parents\n");
    }
    else
    {
        return;
    }
    
    printf("%d\n",tmp);
}


int tmp1 = 5;

void f1()
{
    int pid = fork();
    if(pid == 0)
    {
        tmp1++;
        printf("son\n");
    }
    else if(pid > 0)
    {
        printf("parents\n");
    }
    else
    {
        return;
    }
    
    printf("%d\n",tmp1);
}

void f2()
{
    int *tmp2 = (int*)malloc(sizeof(int));
    *tmp2 = 0;
    int pid = fork();
    if(pid == 0)
    {
        (*tmp2)++;
        printf("son\n");
    }
    else if(pid > 0)
    {
        printf("parents\n");
    }
    else
    {
        return;
    }
    
    printf("%d\n",*tmp2);
}

以上三个函数输出中父进程与子进程打印的tmp值均不相同

可得出结论,fork() 后生成新的子进程与父进程是相互独立的,拥有独立的VMA





                                    
展开阅读全文

没有更多推荐了,返回首页