Linux -- 進程管理之fork() 函數

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





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章