⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fork_3.c

📁 工ARM_LINUX的几个源代码
💻 C
字号:
    1、

    #include <stdio.h>

    main( )

    {

        int p1,p2;

        while((p1=fork( ))= = -1);        /*创建子进程p1*/

        if (p1= =0)  putchar('b');        

        else 

            { 

                while((p2=fork( ))= = -1);   /*创建子进程p2*/

                if(p2= =0)  putchar('c');   

                else putchar('a');     

            }

    }

    2、

    #include <stdio.h>

    main( )

    {

        int p1,p2,i;

        while((p1=fork( ))= = -1);          /*创建子进程p1*/

        if (p1= =0)

              for(i=0;i<10;i++)

                    printf("daughter  %d\n",i);

        else

            {

                while((p2=fork( ))= = -1);   /*创建子进程p2*/

                if(p2= =0)

                    for(i=0;i<10;i++)

                         printf("son  %d\n",i);

                else

                    for(i=0;i<10;i++)

                         printf("parent  %d\n",i);

            }

    }

 /*

    五、运行结果

    1、bca,bac, abc ,……都有可能。

    2、parent…

        son…

        daughter..

        daughter..

    或  parent…

        son…

        parent…

        daughter…等

    六、分析原因

    除strace 外,也可用ltrace  -f  -i  -S  ./executable-file-name查看以上程序执行过程。

    1、从进程并发执行来看,各种情况都有可能。上面的三个进程没有同步措施,所以父进程与子进程的输出内容会叠加在一起。输出次序带有随机性。

    2、由于函数printf( )在输出字符串时不会被中断,因此,字符串内部字符顺序输出不变。但由于进程并发执行的调度顺序和父子进程抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。这与打印单字符的结果相同。

    补充:进程树

    在UNIX系统中,只有0进程是在系统引导时被创建的,在系统初启时由0进程创建1进程,以后0进程变成对换进程,1进程成为系统中的始祖进程。UNIX利用fork( )为每个终端创建一个子进程为用户服务,如等待用户登录、执行SHELL命令解释程序等,每个终端进程又可利用fork( )来创建其子进程,从而形成一棵进程树。可以说,系统中除0进程外的所有进程都是用fork( )创建的。
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -