2)生成的子进程会复制fork函数之后的代码,它在父进度中的再次来到值是子进度的

它在父进程中的返回值是子进程的,它在父进程中的返回值是子进程的

在linux中,用fork来创建三个子历程,该函数有如下特征:

在linux中,用fork来创建三个子历程,该函数有如下特征:

1)执行一遍,重返二次,它在父进度中的再次来到值是子进程的
PID,在子进度中的再次来到值是 0。子进度想要得到父进度的 PID 必要调用 getppid
函数。

1)执行两回,重回二回,它在父进度中的重返值是子进度的
PID,在子进度中的重返值是 0。子进度想要得到父进度的 PID 要求调用 getppid
函数。

2)生成的子进度会复制fork函数之后的代码

2)生成的子进度会复制fork函数之后的代码

3)父子进程的全局变量和部分变量,是不共享的

3)父子进度的全局变量和一些变量,是不共享的

4)子进度会继承父过程的条件景况

4)子进度会继承父进程的环境气象

/*================================================================
*   Copyright (C) 2018 . All rights reserved.
*   
*   文件名称:fork.c
*   创 建 者:ghostwu(吴华)
*   创建日期:2018年01月12日
*   描    述:fork基本使用
*
================================================================*/


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

int count = 10;

int main(int argc, char *argv[])
{
    pid_t pid;    

    int var = 5;

    printf( "----fork之前------,当前进程id=%d\n", getpid() );

    pid = fork();

    printf( "----fork之后------\n" );

    if( pid < 0 ) {
        perror( "fork" );
        exit( -1 );
    }else if( pid == 0 ) { 
        //子进程
        var++;
        count++;
    }else {
        sleep( 3 );
    }

    printf( "fork返回值pid=%d, 当前进程pid=%d, count=%d, var=%d\n", pid, getpid(), count, var );
    return 0;
}
/*================================================================
*   Copyright (C) 2018 . All rights reserved.
*   
*   文件名称:fork.c
*   创 建 者:ghostwu(吴华)
*   创建日期:2018年01月12日
*   描    述:fork基本使用
*
================================================================*/


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

int count = 10;

int main(int argc, char *argv[])
{
    pid_t pid;    

    int var = 5;

    printf( "----fork之前------,当前进程id=%d\n", getpid() );

    pid = fork();

    printf( "----fork之后------\n" );

    if( pid < 0 ) {
        perror( "fork" );
        exit( -1 );
    }else if( pid == 0 ) { 
        //子进程
        var++;
        count++;
    }else {
        sleep( 3 );
    }

    printf( "fork返回值pid=%d, 当前进程pid=%d, count=%d, var=%d\n", pid, getpid(), count, var );
    return 0;
}

图片 1

图片 2

上例,大家可以看到:

上例,我们可以见见:

1)子进程并不会输出”fork在此之前“那段代码,因为子进度拷贝的是fork之后的代码

1)子进度并不会输出”fork以前“那段代码,因为子进度拷贝的是fork之后的代码

2)子进程对变量操作之后,对父进度的变量没有此外影响,他们是1个差其余副本

2)子进度对变量操作之后,对父进程的变量没有任何影响,他们是三个差其余副本

3)标准输出是行缓冲情势:碰到换行符时举办刷新、缓冲区满了的时候刷新、强制刷新(fflush);而业内输出(stdout)是行缓冲,因为涉及到极限设备;

3)标准输出是行缓冲方式:碰到换行符时举行刷新、缓冲区满了的时候刷新、强制刷新(fflush);而规范输出(stdout)是行缓冲,因为涉及到终极设备;

 

 

把这么些事例的输出情势,再改一下:

把这些例子的输出格局,再改一下:

图片 3

图片 4

此地,你会发觉,多了多个出口( “fork从前”
),因为,拔取管道重定向输出之后,IO操作就改成了全缓冲形式,子进程暴发的时候是会复制父进度的缓冲区的数码的,所以子进度刷新缓冲区的时候子进程也会将从父进度缓冲区中复制到的故事情节刷新出来。因而,在运用
fork爆发子进度从前一定要利用 fflush(NULL) 刷新全数缓冲区!

此处,你会发觉,多了八个出口( “fork此前”
),因为,采纳管道重定向输出之后,IO操作就成为了全缓冲情势,子进程暴发的时候是会复制父进度的缓冲区的数额的,所以子进度刷新缓冲区的时候子进度也会将从父进度缓冲区中复制到的内容刷新出来。由此,在利用
fork发生子进度此前一定要接纳 fflush(NULL) 刷新全数缓冲区!

图片 5图片 6

图片 7图片 8

/*================================================================
*   Copyright (C) 2018 . All rights reserved.
*   
*   文件名称:fork.c
*   创 建 者:ghostwu(吴华)
*   创建日期:2018年01月12日
*   描    述:fork基本使用
*
================================================================*/


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

int count = 10;

int main(int argc, char *argv[])
{
    pid_t pid;    

    int var = 5;

    printf( "----fork之前------,当前进程id=%d\n", getpid() );


    fflush( NULL );
    pid = fork();

    printf( "----fork之后------\n" );

    if( pid < 0 ) {
        perror( "fork" );
        exit( -1 );
    }else if( pid == 0 ) { 
        //子进程
        var++;
        count++;
    }else {
        sleep( 3 );
    }

    printf( "fork返回值pid=%d, 当前进程pid=%d, count=%d, var=%d\n", pid, getpid(), count, var );
    return 0;
}
/*================================================================
*   Copyright (C) 2018 . All rights reserved.
*   
*   文件名称:fork.c
*   创 建 者:ghostwu(吴华)
*   创建日期:2018年01月12日
*   描    述:fork基本使用
*
================================================================*/


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

int count = 10;

int main(int argc, char *argv[])
{
    pid_t pid;    

    int var = 5;

    printf( "----fork之前------,当前进程id=%d\n", getpid() );


    fflush( NULL );
    pid = fork();

    printf( "----fork之后------\n" );

    if( pid < 0 ) {
        perror( "fork" );
        exit( -1 );
    }else if( pid == 0 ) { 
        //子进程
        var++;
        count++;
    }else {
        sleep( 3 );
    }

    printf( "fork返回值pid=%d, 当前进程pid=%d, count=%d, var=%d\n", pid, getpid(), count, var );
    return 0;
}

View Code

View Code

图片 9

图片 10

本条时候,就不会有多个(“fork以前”
),因为fork生成子进程在此以前,已经把父进度缓冲区的多少刷新到基本缓冲区,不在标准IO的缓冲区

本条时候,就不会有五个(“fork以前”
),因为fork生成子进度此前,已经把父过程缓冲区的多寡刷新到基础缓冲区,不在标准IO的缓冲区

子进程假使比父进度先截止,那么子进度会变成僵尸进度。

因为:它们必须得拭目以俟父进度为其“收尸”才能彻底释放,假诺父进程先为止了,那么这几个子进度的父进度会变成
1 号 init 进度,当那几个子进度运营截止时会变成僵尸进度,然后 1 号 init
进度就会登时为它们收尸

图片 11图片 12

/*================================================================
*   Copyright (C) 2018 . All rights reserved.
*   
*   文件名称:fork3.c
*   创 建 者:ghostwu(吴华)
*   创建日期:2018年01月12日
*   描    述:
*
================================================================*/

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

int main(int argc, char *argv[])
{
    pid_t pid;
    int i = 0;

    for( i = 0 ; i < 10; i++ ) {
        pid = fork();
        if( pid < 0 ) {
            perror( "fork()" );
            exit( -1 ); 
        }else if( pid == 0 ) {
            printf( "[pid]=%d\n", getpid() );
            exit( 0 );
        }
    }
    sleep( 10 );

    return 0;
}

View Code

 

图片 13

子进度如若比父进度先停止,那么子进程会变成僵尸进度。

因为:它们必须得拭目以俟父进度为其“收尸”才能彻底释放,假使父进度先停止了,那么这几个子进程的父进度会变成
1 号 init 进度,当这么些子进度运维停止时会变成僵尸进度,然后 1 号 init
进度就会立即为它们收尸

图片 14图片 15

/*================================================================
*   Copyright (C) 2018 . All rights reserved.
*   
*   文件名称:fork3.c
*   创 建 者:ghostwu(吴华)
*   创建日期:2018年01月12日
*   描    述:
*
================================================================*/

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

int main(int argc, char *argv[])
{
    pid_t pid;
    int i = 0;

    for( i = 0 ; i < 10; i++ ) {
        pid = fork();
        if( pid < 0 ) {
            perror( "fork()" );
            exit( -1 ); 
        }else if( pid == 0 ) {
            printf( "[pid]=%d\n", getpid() );
            exit( 0 );
        }
    }
    sleep( 10 );

    return 0;
}

View Code

 

图片 16

父进度倘诺比子进度先截止,那么子进度会变成孤儿进程

 全体子进度的父进程都成为了 1 号 init 进度

图片 17图片 18

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

int main(int argc, char *argv[])
{
    pid_t pid;
    int i = 0;

    for( i = 0 ; i < 10; i++ ) {
        pid = fork();
        if( pid < 0 ) {
            perror( "fork()" );
            exit( -1 ); 
        }else if( pid == 0 ) {
            sleep( 10 );
            printf( "[pid]=%d\n", getpid() );
            exit( 0 );
        }
    }

    return 0;
}

View Code

 

 图片 19

 

父进程假如比子进程先为止,那么子进度会变成孤儿进度

 全部子进度的父进度都改为了 1 号 init 进度

图片 20图片 21

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

int main(int argc, char *argv[])
{
    pid_t pid;
    int i = 0;

    for( i = 0 ; i < 10; i++ ) {
        pid = fork();
        if( pid < 0 ) {
            perror( "fork()" );
            exit( -1 ); 
        }else if( pid == 0 ) {
            sleep( 10 );
            printf( "[pid]=%d\n", getpid() );
            exit( 0 );
        }
    }

    return 0;
}

View Code

 

 图片 22