• 实验二 进程创建


    1.ps命令的使用(请将使用的命令和结果写在实验报告册中)

    (1)显示所有进程,找出使用当前进程的进程ID号,查看其状态。

    ps -aux
    
    • 1

    该命令显示所有包含其他使用者的进程

    在这里插入图片描述
    在这里插入图片描述
    我并不理解什么叫“使用当前进程的进程ID号”,也许指的是ps -aux这个命令?如果是的话,ID号为22385 ,状态为R+,即运行状态、前台显示。

    (2)列出目前所有面向用户的进程。(进程内可省略)

    ps -ef
    
    • 1

    在这里插入图片描述

    该命令表示查看全格式的全部进程(所以应该就是所有用户的进程吧?)

    (3)显示所有自己所在用户的进程,并以长格式输出。

    ps -U 用户名 -l
    
    • 1

    在这里插入图片描述

    (4)用面向任务的格式显示个人用户中bash命令中的所有实例;并查看其父进程的详细信息。

    ps -l|grep bash
    
    • 1

    在这里插入图片描述

    不理解什么是“面向任务的格式”,这里用了长格式,也不理解什么是“个人用户中bash命令中的所有实例”,所以这里列出了名字中含bash的进程,可以看出,该进程父进程的id为4147

    cat /proc/pid/status
    
    • 1

    在这里插入图片描述

    2.进程的创建

    (1)编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。
    参考程序

    <程序2.1>

    #include 
    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');    
    }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    分析并运行该程序回答如下问题,将结果与分析写在实验报告中。

    问题1:该程序的运行结果为何?多次运行后结果是否相同,为什么?
    多次运行结果如下:
    在这里插入图片描述
    程序运行结果为bac、abc,多次运行的结果不相同。因为3个进程没有同步措施,父进程和两个子进程的输出具有随机性。

    问题2:修改该程序,使之在打印结果的同时标出是由哪个程序运行的出来的。(利用getpid()函数)

    程序如下;
    在这里插入图片描述
    结果如下:
    在这里插入图片描述

    (2)进程的父进程和子进程
    编写一段程序,使用系统调用fork()创建一个子进程。让子进程和父进程并发同时在每个进程中显示其子进程与父进程的PID号。

    <程序2.2>

    #include 
    #include 
    #include
    int main(void)
    {
    pid_tpid;
    printf("before calling fork,calling process pid = %d\n",getpid());
    pid = fork();
        if(pid == -1)         /*创建失败*/
    {printf("fork fail!\n");
    exit(1);}		/*表示异常退出.这个1是返回给操作系统的*/
    if(pid == 0){
    printf("this is child process and child's pid = %d,parent'spid %d\n",getpid(),getppid());
        }
    if(pid> 0){
     //sleep(1);	/*表示睡眠1秒*/
    printf("this is parent process and pid =%d ,child's pid = %d\n",getpid(),pid);
        }
    
    return 0;
    exit(0);			/*表示正常退出*/
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    分析并运行该程序回答如下问题,将结果与分析写在实验报告中。
    问题1:程序中红色部分的作用可以让执行该语句的进程等待一秒钟后继续执行,当不添加改语句时程序的运行结果是什么?为什么?
    运行结果如下:
    在这里插入图片描述
    不添加sleep(1)时,程序不会等待1秒,不会将执行机会(CPU)让给其他线程
    问题2:添加sleep(1)语句后程序的运行结果是什么?与不加该语句有何区别?为什么?
    运行结果如下:
    在这里插入图片描述
    加上sleep(1)后,程序会等待1秒,将执行机会(CPU)让给其他线程,但是不会释放锁,因此休眠时间结束后自动恢复(程序回到就绪状态)
    问题3:通过PS命令查看各个程序的状态,并分析。
    将sleep改为10,即sleep(10),编译该程序,程序名为demo22:

    gcc -o demo22 demo2.c
    
    • 1

    运行该程序:

    ./demo22
    
    • 1

    在10s内执行如下指令:

    ps -aux|grep demo22
    
    • 1

    10s后再次执行:

    ps -aux|grep demo22
    
    • 1

    在这里插入图片描述
    第一次ps命令显示有3个名字中含demo22的程序,第一行状态为S+,表明当前程序正在睡眠,但可被某些讯号唤醒,第二行状态为Z+,表示该程序应该已经终止,但是其父程序却无法正常的终止他,造成僵尸程序的状态,第三行状态为R+,表示该程序目前正在运作,或者是可被运作。
    第二次PS命令显示有1个名字中含有demo22的程序,状态为S+,可以看出,这个进程和第一次ps命令的第三行是同一个名字,这行的意思是我们查询的grep命令本身。

  • 相关阅读:
    web前端课程设计——重庆旅游7页 HTML+CSS+JavaScript
    oracle(PLsql)/mysql 建表
    一文读懂Python异常
    解决java发邮件错误javax.net.ssl.SSLHandshakeException: No appropriate protocol
    VSCODE linux 解决头文件未找到问题、g++的常用编译参数
    springBoot集成mongo相关常用基础和复杂操作
    初识Java 17-4 反射
    深度学习之基于YoloV5-Deepsort人物识别与追踪系统
    向量矩阵范数pytorch
    netlink原理及应用
  • 原文地址:https://blog.csdn.net/fjdep/article/details/127534162