实验二 进程控制

原创作品转载请注明出处


编写程序创建进程树如图1和图2所示,在每个进程中显示当前进程识别码和父进程识别码。


1

#include<stdio.h>
int main()
{
    int p1, p2, p3;//b, c, d
    while((p1=fork()) == -1) ;
    if(p1 != 0)
    {
        printf("process a\'s pid is %d, a\'s ppid is %d\n", getpid(), getppid());
    } 
    else 
    {
        while((p2=fork()) == -1) ;
        if(p2 != 0)
        {
            printf("process b\'s pid is %d, b\'s ppid is %d\n", getpid(), getppid());
        }
        else
        {
            while((p3=fork()) == -1) ;
            if(p3 != 0)
            {
                printf("process c\'s pid is %d, c\'s ppid is %d\n", getpid(), getppid());
            }
            else
            {
                printf("process d\'s pid is %d, d\'s ppid is %d\n", getpid(), getppid());
            }
        }
    }
}

2

version 1
#include<stdio.h>
int main()
{
    int p1, p2, p3, p4;//b,c,d,e
    while((p1=fork()) == -1 || (p3=fork()) == -1) ;
    if(p1 > 0 && p3 > 0)
    {
        printf("process a\'s pid is %d, a\'s ppid is %d\n", getpid(), getppid());
    }
    else if(p1 > 0)
    {
        while((p2=fork()) == -1) ;
        if(p2 > 0)
        {
            printf("process b\'s pid is %d, b\'s ppid is %d\n", getpid(), getppid());
        }
        else
        {
            printf("process c\'s pid is %d, c\'s ppid is %d\n", getpid(), getppid());
        }
    }
    else if (p3 > 0)
    {
        while((p4=fork()) == -1) ;
        if(p4 > 0)
        {
            printf("process d\'s pid is %d, d\'s ppid is %d\n", getpid(), getppid());
        }
        else
        {
            printf("process e\'s pid is %d, e\'s ppid is %d\n", getpid(), getppid());
        }
    }
}
version 2

通过对fork返回的值是否为零,判断是否是在新建立的子进程中。

#include <stdio.h>

int main() {
    int p_b, p_c, p_d, p_e;
    while((p_b=fork()) == -1) ;
    if(0 == p_b) {
        while((p_c=fork()) == -1) ;
        if(0 == p_c) {
            printf("process c\'s pid is %d, c\'s ppid is %d\n", getpid(), getppid());
        } else {
            printf("process b\'s pid is %d, b\'s ppid is %d\n", getpid(), getppid());
        }
    } else {
        while((p_d=fork()) == -1) ;
        if (0 == p_d) {
            while((p_e=fork()) == -1) ;
            if (0 == p_e) {
                printf("process e\'s pid is %d, e\'s ppid is %d\n", getpid(), getppid());
            } else {
                printf("process d\'s pid is %d, d\'s ppid is %d\n", getpid(), getppid());
            }
        } else {
            printf("process a\'s pid is %d, a\'s ppid is %d\n", getpid(), getppid());
        }
    }
}

运行结果:
process a's pid is 3412, a's ppid is 2987
process b's pid is 3413, b's ppid is 3412
process c's pid is 3415, c's ppid is 3413
process d's pid is 3414, d's ppid is 3412
process e's pid is 3416, e's ppid is 3414

相关链接:

1.进程管理
2.unistd.h
3.wait

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Linux 进程管理与程序开发 进程是Linux事务管理的基本单元,所有的进程均拥有自己独立的处理环境和系统资源,...
    JamesPeng阅读 2,512评论 1 14
  • Charles解决Https乱码的问题,网上有很多方法了,我安装的是4.0,参照一一处理,但都不能正常抓取Http...
    rorschachwhy阅读 339评论 0 0
  • 一、vue模块化开发 所谓的模块化开发是指将不同的部分封装到不同的模块中,不再将所有的组件、路由等写在一个页面中。...
    间阳幕宾阅读 585评论 0 1
  • 如题 每两三天再看部电影什么的。 今天买了三小盆多肉和一只水仙,算新开始吧。
    艾玛鱼阅读 275评论 0 1
  • 好像有人敲院门,孙伯让好像也清醒了两秒钟,接着又睡了。再次醒来是因为听到咕咚医生,他撑着椅背爬起来去开门,一个小人...
    姜辣素阅读 169评论 0 0