操作系统实验

  • 格式:docx
  • 大小:658.30 KB
  • 文档页数:25

操作系统上机报告姓名:张宇尘学号:11070218学院:计算机学院完成日期:2013年11月目录实验一 LINUX入门 (2)实验二进程管理 (3)实验三线程的管理 (8)实验四利用信号量实现进程控制 (12)实验五基于消息队列和共享内存的进程间控制 (17)收获和体会 (24)实验一:LINUX入门一、实验目的:了解UNIX/LINUX运行环境,熟悉UNIX/LINUX的常用基本命令,熟悉和掌握UNIX/LINUX 下c语言程序的编写、编译、调试和运行方法。

二、实验内容:熟悉UNIX/LINUX的常用基本命令如ls、who、pwd、ps等。

练习UNIX/LINUX的文本行编辑器vi的使用方法熟悉UNIX/LINUX下c语言编译器cc/gcc的使用方法。

用vi编写一个简单的显示“Hello,World!”c语言程序,用gcc编译并观察编译后的结果,然后运行它。

三、实验要求:按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。

四、实验设计:代码:#include "stdio.h"void main(){printf("helloworld\n");}五、实验测试结果:实验二:进程管理一、实验目的:加深对进程概念的理解,明确进程与程序的区别;进一步认识并发执行的实质。

二、实验内容:(1)进程创建编写一段程序,使用系统调用 fork()创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一个字符:父进程显示“a“;子进程分别显示字符”b“和字符“c”。

试观察记录屏幕上的显示结果,并分析原因。

(2)进程控制修改已编写的程序,将每一个进程输出一个字符改为每一个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。

( 3)进程的管道通信编写程序实现进程的管道通信。

使用系统调用 pipe()建立一个管道,二个子进程P1 和P2 分别向管道各写一句话:Child 1 is send ing a message!Child 2 is sending a message!父进程从管道中读出二个来自子进程的信息并显示(要求先接收 P1,再接收 P2)。

三、实验要求:按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。

四、实验设计:代码:(1)进程创建:#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.h>#include <string.h>#include <errno.h>#define INPUT 0#define OUTPUT 1int main() {int file_descriptors[2];pid_t pid; // process IDpid_t pid2;char * msg = "child1.";char * msg2 = "child2.";char buf[256];int returned_count;int result;result = pipe(file_descriptors);if (result == -1) {perror("Failed in calling pipe");}pid = fork();if (pid == -1) {perror("Failed in calling fork");exit(1);} else if (pid == 0) {printf("bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbbbbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb\n");close(file_descriptors[INPUT]);write(file_descriptors[OUTPUT], msg, 1 + strlen(msg));close(file_descriptors[OUTPUT]);exit(0);} else {printf("aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa\n");close(file_descriptors[OUTPUT]);returned_count = read(file_descriptors[INPUT], buf, sizeof (buf));close(file_descriptors[INPUT]);}pid2=fork();if (pid2 == -1) {perror("Failed in calling fork");exit(1);} else if (pid2 == 0) {printf("cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc\n");close(file_descriptors[INPUT]);write(file_descriptors[OUTPUT], msg, 1 + strlen(msg));close(file_descriptors[OUTPUT]);exit(0);} else {close(file_descriptors[OUTPUT]);returned_count = read(file_descriptors[INPUT], buf, sizeof (buf));close(file_descriptors[INPUT]);}return (EXIT_SUCCESS);}(2)进程管理:#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<sys/wait.h>#include<stdlib.h>#include<string.h>#define INPUT 0#define OUTPUT 1void main() {int file_descriptors[2]; //定义子进程号pid_t pid1,pid2;char buf[29];char test1[256] = "Child 1 is sending a message\n";char test2[256] = "Child 2 is sending a message\n";int returned_count;pipe(file_descriptors); //创建管道if((pid1 = fork()) == -1) {printf("Error in fork\n");exit(1);if(pid1 == 0) {printf("<<Child1>>\n");close(file_descriptors[INPUT]);printf("sending...\n");write(file_descriptors[OUTPUT], test1, strlen(test1));printf("sending completed\n");exit(0);}else {wait(NULL);printf("back to the parent process\n");pid2 = fork();if(pid2 < 0){printf("Error in fork\n");exit(1);}else if(pid2 == 0){printf("<<Child2>>\n");close(file_descriptors[INPUT]);printf("sending...\n");write(file_descriptors[OUTPUT], test2, strlen(test2));printf("sending completed\n");exit(0);}else if(pid1 > 0){wait(NULL); //等待进程结束close(file_descriptors[OUTPUT]);returned_count = read(file_descriptors[INPUT], buf, sizeof(buf));printf("%d bytes of data received from spawnedprocess: %s\n",returned_count,buf);returned_count = read(file_descriptors[INPUT], buf, sizeof(buf));printf("%d bytes of data received from spawnedprocess: %s\n",returned_count,buf);}}}五、实验结果:1、进程创建:2、进程管理:六、结果分析:在大量的输出a、b、c可能会出现间断,是因为时间片到了。