操作系统原理及安全2-进程管理实验(验证型)

  • 实验目的
  1. 熟悉Linux的进程机制。
  2. 熟悉fork、vfork、exit、_exit函数的使用。

二、实验软硬件要求

  1、CPU:P4 1.6GHz   内存:4G

  2、Windows平台上的Linux虚拟机

  • 实验预习

(1)编写一个程序,创建一个子进程,显示“New process.” 子进程在休眠(10秒)后,通过调用getpid()和getppid()获取父、子进程的id后结束并退出exit()。父进程调用waitpid()等待子进程结束,并同样返回其父、子进程的id。(提示:运行过程中配合ps -l命令查看进程的家族关系。)

(2)编制一段程序,使用系统调用fork()创建两个子进程,在该程序运行时,在系统中就有一个父进程和两个子进程在活动。让每一个进程在屏幕上显示一个字符:父进程显示字符aaa,子进程分别显示字符bbb和字符ccc。试观察、记录并分析屏幕上,进程运行的情况。(提示:分别给出调用与不调用waitpid(0,NULL,0)函数的结果分析。)

实验二:

参考程序

#include<stdio.h>

#include<stdlib.h>

main()

{

int p1,p2,ret;

int p3,p4;

while((p1=fork())==-1);

       if(p1==0)

            {printf("new program");

sleep(10);p1=getpid();

p2=getppid();printf("childid=%d,parentid=%d\n",p1,p2);

 exit(0);

}

{

ret=waitpid(0,NULL,0);

p3=getpid();p4=getppid();

printf("parentid=%d,pp-id%d\n",p3,p4);

printf("waitpid=%d",ret);

}}

改良版第一题

#include<sys/types.h>

#include<stdio.h>

#include<unistd.h>

#include<stdlib.h>

int main(){

       pid_t pid;

       while((pid=fork())==-1);

              if(pid==0){

                     printf("new program\n");

                     sleep(10);

                     printf("I am the child process,ID is %d\n",getpid());

                     printf("I am the father process,ID is %d\n",getpid());

                     exit(0);

                     }

{

       int ret=waitpid(0,NULL,0);

       printf("parentid=%d,pp-id%d\n",getpid(),getppid());

       printf("waitpid=%d",ret);

}}

第二题第一版

#include<stdio.h>

#include<stdlib.h>

int main(){

       pid_t ppid,pid,pid2;

       while((pid=fork())==-1||(pid2=fork())==-1);

              if(ppid!=0){

                     printf("aaa\n");

}

              if(pid==0){

                     printf("bbb\n");

}

              if(pid2==0){

                     printf("ccc\n");

}

              exit(0);

{

int ret=waitpid(0,NULL,0);

printf("waitpid=%d",ret);

}

}

第二题第二版

#include<stdio.h>

#include<stdlib.h>

int main()

{

int p1,p2,p5,p6,ret;

int p3,p4;

while((p1=fork())==-1);

       if(p1==0)

            {printf("new program  bbb\n");

sleep(10);p1=getpid();

p2=getppid();printf("bbb-id=%d,parentid=%d\n",p1,p2);

 exit(0);

}

while((p3=fork())==-1);

if(p3==0)

            {printf("new program  ccc\n");

sleep(10);p3=getpid();

p4=getppid();printf("ccc-id=%d,parentid=%d\n",p3,p4);

 exit(0);

}

{ printf("Old program  aaa\n");

  ret=waitpid(0,NULL,0);

}

}

 

三、实验结果分析

(对上述实验内容中的各题结果,进行分析讨论。并回答下列问题)

  1. 进程包括哪些特征?进程与程序有什么不同?

进程具有动态性,并发性,独立性,异步性,结构性。

进程是动态的,并发的,暂时的,而程序是静态的,顺序的,永久的

  1. 你对Linux系统有什么认识?

Linux的最大特点是源代码完全公开。通知具有优良的开放性,硬件和软件彼此兼容,可互联。可悲不同用户拥有,使用,自己的资源有特定权限。同时允许计算机可同时执行多个程序,调度每一个进程平等的访问计算机处理器。

(3)分析第(1)(2)题中进程的家族关系。

打印出aaa的进程是bbb,ccc进程的父进程,bbb,ccc是脱胎于同一父进程的兄弟进程

四、总结:你对本次实验有什么体会或看法。

除了初始进程以外,Linux中每个新的进程都必须由已经在运行的进程来创建,这样构成了父进程和子进程。System是Linux启动的第一个进程,系统中其他的进程都是system的子进程。除了system之外,每个进程都必须有一个父进程,父进程和子进程之间的关系是管理与被管理的关系,当父进程终止时,子进程也随之终止,但是子进程终止,父进程不一定终止。

如果父进程在子进程结束之前就停止了,那么他的子进程就会变成孤儿进程,如果没有对应的处理机制,那么这些孤儿进程将处于僵死状态,资源无法释放。此时,解决的方法是在已经启动的进程里找到一个进程作为这孤儿进程父进程,或者直接让system进程作为他们的父进程,继而释放孤儿进程占用的资源。

附:系统调用函数说明:

(1)fork()函数,创建一个新进程。

格式:int fork()

其中返回int取值意义如下:

    0:创建子进程,从子进程返回的值

    >0:从父进程返回的子进程id值

    -1:创建失败

(2)getpid()与getppid();

    获取进程及其父进程的id.

(3)waitpid(pid,status,options)

    可用调用格式:waitpid(0,NULL,0)

功能:waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用 waitpid()时子进程已经结束,则 waitpid()会立即返回子进程结束状态值。

参数设置:pid=0,表示等待进程组识别码与目前进程相同的任何子进程;

          status=NULL, 表示忽略进程的结束状态;

          options=0,表示不提供了一些额外的选项来控制waitpid。

(4)相关的头文件包含如下:

#include<stdio.h>

#include<sys/types.h>

#include<unistd.h>

#include<stdlib.h>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值