实验三 进程管理

CV实验报告手机端适配有问题

建议电脑端

《操作系统》实验报告

姓名

Rhyme_7

学号

777777

实验序号

3

实验名称

实验三   进程管理

实验目的

1.加深对进程概念的理解,进一步认识并发执行的实质。

2.掌握在Linux 操作系统中创建子进程并加载新映像的操作。

3.掌握有关进程的管理机制。

实验内容

实验题目(1

编写一个C 程序,使用系统调用fork()创建一个子进程,并使用这个子进程调用exec 函数族以执行系统命令ls。

实验代码、实验过程(界面方式下的抓图)、实验结果(抓图)

#include<stdio.h> 

#include<unistd.h> 

#include<stdlib.h> 

#include<sys/types.h>

#include<sys/wait.h> 

int main(){      

    int pid;    

    pid=fork(); /* 创建子进程 */        

    switch(pid){ 

        case -1:     /* 创建失败 */       

            printf("fork fail!\n"); 

            exit(1); 

        case 0:  /* 子进程*/             

            printf("Child process PID:%d.\n",getpid()); 

            execlp("/bin/ls","ls",NULL); /* 装载子进程映像 ls 命令*/ 

            printf("exec fail!\n"); 

            exit(1); 

        default:  /* 父进程*/                     

            printf("Parent process PID: %4d.\n",getpid()); 

            wait(NULL);  /* 父进程等待子进程运行完毕 */       

            printf("ls completed !\n"); 

            exit(0); 

    } 

     return 0; 

问题1:该程序中一共有几个进程并发?

两个

问题2:wait(NULL)起到了什么作用,如果删除会出现什么情况,为什么?

wait()调用后立即阻塞自己,直到当前进程的某个子进程退出。其参数用来保存被收集进程退出时的一些状态。如果我们不关心子进程是如何死掉,只想把这个僵尸进程消灭掉,我们就可以设定这个参数为NULL。

所以作用是等待子进程运行完毕,消灭僵尸进程。

如果删掉wait(NULL)将不会等待,子进程将成为僵尸进程。

实验心得(遇到什么问题,如何解决)

不太懂各个函数。查看课堂派文档和PPT

实验题目(2

编写一个C程序,使用系统调用fork()创建一个子进程,并使这个子进程在退出时通过exit()给出退出参数,父进程通过wait()收集子进程返回的参数并显示。

实验代码、实验过程(界面方式下的抓图)、实验结果(抓图)

#include<stdio.h> 

#include<sys/types.h> 

#include<sys/wait.h> 

#include<unistd.h> 

#include<stdlib.h> 

int main(){ 

    int status; 

    pid_t pc,pr; 

    pc=fork(); 

    if(pc<0)      

        printf("error ocurred!\n");  

    else if(pc==0){ 

        printf("This is child process with pid of %d.\n",getpid());  

        exit(3); 

    } 

    else{ 

        pr=wait(&status); 

        if(WIFEXITED(status)){ 

            printf("the child process exit normally.\n"); 

            printf("the return code is %d.\n",WEXITSTATUS(status)); 

        } 

        else 

            printf("the child process exit abnormally.\n");  

    } 

问题1:该程序中的pr变量的值代表的什么含义?

Pr的值是一个整数值(int),指出了子进程是正常退出还是被非正常结束的,以及正常结束时的返回值,或被哪一个信号结束的等信息。

WEXITSTATUS(status) 当WIFEXITED返回非零值时,我们可以用这个宏来提取子进程的返回值,如果子进程调用exit(5)退出,WEXITSTATUS(status) 就会返回5;如果子进程调用exit(7),WEXITSTATUS(status)就会返回7。

此次运行结果就是exit(3)

问题2:如果程序中出现出现exit(0)和exit(1)代表什么意思?

exit(0)表示进程正常终止,exit(1)表示进程运行有错,异常终止

实验心得(遇到什么问题,如何解决)

不太明白wait()参数的意义。查找资料:

https://zhuanlan.zhihu.com/p/549981187

实验题目(3

3.3 编写程序:创建一对父子进程,实验wait同步函数。要求子进程休眠5秒,父进程不休眠。但需要父进程等待子进程,并在子进程结束后收集子进程用exit返回的参数。

实验代码、实验过程(界面方式下的抓图)、实验结果(抓图)

#include<stdio.h>

#include<unistd.h>

#include<stdlib.h>

#include<sys/types.h> 

#include<sys/wait.h>

int main(){

         int status;

         pid_t pid = fork();

         if(pid<0){

             printf("error ocurred!\n");     

         }

         else if(pid==0){

             printf("This is child process with pid of %d.\n",getpid());      

             sleep(5);

             exit(0);

         }

         else{

             printf("Parent process PID: %4d.\n",getpid());

                 wait(&status);

                 printf("the child return code is %d.\n",WEXITSTATUS(status));

         }

}

5s后:

实验心得(遇到什么问题,如何解决)

 参考:

实验三 进程管理_Re:从零开始的代码生活的博客-CSDN博客https://blog.csdn.net/fjdep/article/details/127595600

猜你喜欢

转载自blog.csdn.net/qq_54499870/article/details/127619765