您的当前位置:首页linux操作系统实验五

linux操作系统实验五

2021-07-03 来源:飒榕旅游知识分享网


linux操作系统实验五

实验五 进程管理子系统——进程控制

实验类别:设计型

实验时数:6学时

开课单位:计算机学院 实验地点:健翔校区计算中心

一、实验目的

 掌握进程的概念,深入理解进程的含义。认识并理解并发环境中进程执

行的实质问题,了解构成并发机制的进程创建过程。能够使用系统调用完成进程创建,形成多个进程并发的环境。

 了解在进程创建后通过对进程控制的系统调用,可实现对进程的有效控

制。掌握在进程执行中对进程进行睡眠、同步、撤销等控制方法。  进一步认识并发执行的实质,分析进程竞争资源的现象,学习解决进程

互斥的方法。

二、实验环境

操作系统:任何Unix/Linux及Sun Solaris 或 windows 系列

应用系统:gcc编译器。若OS为windows系列,则还需相应的模拟环境

三、预备知识

1、 LINUX系统中进程的含义

0

在LINUX中,进程既是一个独立拥有资源的基本单位,又是一个独立调度的基本单位。进程是并发环境中的实体,每个进程用一个task_struct的数据结构来表示,用来管理系统中的进程,因而task_struct就是LINUX系统中的PCB。另外,系统内核中还有一个task向量表,是指向系统中每一个task_struct数据结构的指针的数组,因而task向量表就是LINUX系统中的PCB表。

2、 LINUX中的进程创建

除了init进程外,LINUX中的所有进程都是由其他进程创建的。LINUX中提供了系统调用fork和clone,可被进程用来创建子进程。但系统调用fork和clone其实都是调用内核函数do_fork(),通过克隆当前进程来创建子进程的。

四、实验内容

本实验要求在LINUX/UNIX环境下用C语言编写三个多进程并发执行的程序,基本涉及了LINUX/UNIX进程管理子系统中较为常用的有关进程控制的系统调用。实验内容如下:

(1) 使用fork()系统调用创建进程,使父、子进程分别运行不同的代码(要

求子进程在父进程之前运行):

子进程:①以长格式显示当前目录的情况;②分屏显示file1的内容。 父进程:①对1—100之间的自然数求和;②分屏显示file2的内容。

程序可能涉及到的系统调用:fork(), exec(), wait()

1

#include #include #include #include #include int main() {

int p1,p2; int i,n=0;

2

p1 = fork(); if(p1 == 0) {

//system(\"more -dc file1\"); execl(\"/bin/ls\ exit(1); }

else if(p1 > 0) {

wait(NULL);

//system(\"more -dc file2\"); p2 = fork(); if(p2 == 0) {

execl(\"/bin/cat\ }

else if(p2 > 0) { wait(NULL);

3

for(i = 1 ; i <= 100 ; i++) { n = n + i ; }

printf(\"the add of 1-100 is:%d\\n\ execl(\"/bin/cat\ exit(1); } } else

printf(\"fork failed.\\n\");

return 0; }

(2) 编程实现三个进程的并发执行(即父进程同其分别创建的两个子进程同

时运行),此程序运行使系统中有三个活动进程存在。控制让每个进程在屏幕上显示一个字符串(为了便于理解,可以是有意义的一句话)。比如子进程显示”daughter…”及”son…”,父进程显示”parent…”。试观察屏幕上的显示结果,并对输出结果进行分析。 程序可能涉及到的系统调用及函数:fork(), printf()

4

#include #include int main() {

int p1,p2; p1 = fork(); if(p1 == 0) {

printf(\"子进程:son\\n\"); }

else if(p1 > 0)

5

{

p2 = fork(); if(p2 == 0) {

printf(\"子进程:daughter\\n\"); }

else if(p2 > 0) {

printf(\"父进程:parent\\n\"); } } else

printf(\"fork failed.\\n\");

return 0; }

(3) 编程实现并发执行的父子进程通过管道实现通信。要求父进程通过读标

准输入,将读入的内容写入管道;子进程通过读管道,将读取的内容写到标准输出。

程序可能涉及到的系统调用及函数:fork(),pipe(),read(),write(),close()

6

#include #include #include #include #include //char parent[]=\"A message pipe'communication.\\n\";

int main() {

int pid,fd[2]; char buf[100]; char parent[100]; pipe(fd); pid=fork();

read(STDIN_FILENO,parent,100);

7

to

if(pid > 0) {

close(fd[0]);

printf(\"parent process sends a message to child.\\n\");

write(fd[1],parent,sizeof(parent)); close(fd[1]);

printf(\"parent process waits the child to terminate.\\n\"); wait(0);

printf(\"parent process terminate.\\n\"); }

else if(pid == 0) {

close(fd[1]); read(fd[0],buf,100);

printf(\"The message read by child process from parent is:%s\\n \ close(fd[0]);

8

printf(\"child process terminate.\\n\"); } else

printf(\"fork failed.\\n\");

return 0; }

9

因篇幅问题不能全部显示,请点此查看更多更全内容