关于第二次作业课堂笔记

fork()的函数作用是创建一个子进程,这个子进程几乎和原进程是一模一样的。

首先看一下如下的示例代码,根据作业做了适当的调整以显示fork的实际作用:

我在fork调用前和调用后分别输出了一些提示用代码,并在最后的process over部分添加了一些提示用输出语句:

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main() {

    pid_t pid, pid1, pid2;
//    pid2 = getpid();
//    printf("Start fork() function in %d\n", pid2);
    printf("Start fork() function\n");
    pid = fork();
    printf("After fork() function\n");

//    pid2 = getpid();
//    printf("After fork() function in %d\n", pid2);
    if (pid < 0){

        fprintf(stderr, "Fork Failed");
        return 1;

    } else if (pid == 0){
        pid1 = getpid();
        printf("child: pid = %d\n", pid);
        printf("child: pid1 = %d\n", pid1);

    } else{
        wait(NULL);
        pid1 = getpid();
        printf("parent: pid = %d\n", pid);
        printf("parent: pid1 = %d\n", pid1);
    }
    pid2 = getpid();
    printf("Process %d is over\n", pid2);

    return 0;
}

注:注释掉的代码并非错误代码,在之后的笔记中会用到

这段代码在执行后输出的结果为:

Start fork() function
After fork() function
After fork() function
child: pid = 0
child: pid1 = 99090
Process 99090 is over
parent: pid = 99090
parent: pid1 = 99089
Process 99089 is over

 

从这一块我们可以关注到以下几点:

对于fork前的代码,子进程是没有执行的,也就是说只有fork之后的代码被完全还原了。

两个进程是同时执行的,即fork()执行后,两个进程“同时”执行了"After fork() funtion"的printf函数。但是这里有坑,在多进程编程中可能会碰到问题,在之后的程序中会有说明

parent进程是在child进程之后执行的。为什么?因为after fork两者是前后同时输出,但是parent的 “Process xxxx is over”是在child之后执行的

在子进程中,pid = fork()这句将0赋值给pid,几乎不做其他工作,并执行之后的代码工作。当再次执行getpid的时候,我们可以观测到process 的pid已经变成不同的数值。

到这里基本上fork的功能就算介绍完毕,但在使用fork函数的时候我又碰到了一些其他的问题:

新的示例代码如下:

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main() {

    pid_t pid, pid1, pid2;
    pid2 = getpid();
    printf("Start fork() function in %d\n", pid2);
//    printf("Start fork() function\n");
    pid = fork();
//    printf("After fork() function\n");

//    pid2 = getpid();
    printf("After fork() function in %d\n", pid2);
    if (pid < 0){

        fprintf(stderr, "Fork Failed");
        return 1;

    } else if (pid == 0){
        pid1 = getpid();
        printf("child: pid = %d\n", pid);
        printf("child: pid1 = %d\n", pid1);

    } else{
        wait(NULL);
        pid1 = getpid();
        printf("parent: pid = %d\n", pid);
        printf("parent: pid1 = %d\n", pid1);
    }
    pid2 = getpid();
    printf("Process %d is over\n", pid2);

    return 0;
}

程序执行结果为:

Start fork() function in 99213
After fork() function in 99213
After fork() function in 99213
child: pid = 0
child: pid1 = 99214
Process 99214 is over
parent: pid = 99214
parent: pid1 = 99213
Process 99213 is over

在start fork()这句话之前我们就调用了 getpid这句话,但是在After fork()中,输出的是两个完全相同的结果。对如上代码再进行修改:

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main() {

    pid_t pid, pid1, pid2;
    pid2 = getpid();
    printf("Start fork() function in %d\n", pid2);
//    printf("Start fork() function\n");
    pid = fork();
//    printf("After fork() function\n");

    pid2 = getpid();        //再次调用getpid函数获取当前进程id编码
    printf("After fork() function in %d\n", pid2);
    if (pid < 0){

        fprintf(stderr, "Fork Failed");
        return 1;

    } else if (pid == 0){
        pid1 = getpid();
        printf("child: pid = %d\n", pid);
        printf("child: pid1 = %d\n", pid1);

    } else{
        wait(NULL);
        pid1 = getpid();
        printf("parent: pid = %d\n", pid);
        printf("parent: pid1 = %d\n", pid1);
    }
    pid2 = getpid();
    printf("Process %d is over\n", pid2);

    return 0;
}

执行结果如下:

Start fork() function in 99304
After fork() function in 99304
After fork() function in 99308
child: pid = 0
child: pid1 = 99308
Process 99308 is over
parent: pid = 99308
parent: pid1 = 99304
Process 99304 is over

从这里我们几乎可以更清晰的看到各个进程的执行效果:

1.子进程没有执行fork之前的任何编码(子进程id为99308

2.父进程的所有变量数值会传递给子进程,两个进程(至少在不做任何处理的情况下)的变量是共用的!这在多线程(进程)编程中相当重要

3.我们更能确定父进程是在子进程之后执行的对应程序代码。

《---未完待续---》

posted @ 2018-03-31 19:42  Lord_Age  阅读(176)  评论(0)    收藏  举报