操作系统实验报告
}
}
(3)运行结果:Abc任意的排序
(4)结果分析:
从进程执行并发来看,输出Abc的排列都是有可能的。fork()函数创建进程所需的时间虽然可能多于输出一个字符的时间,但各个进程的时间片的获得却不一定是顺序的,所以输出Abc的排列都是有可能的。
2.写一个程序,实现父子进程之间的通信
用管道实现:
pipe_named_write.c
int data_fd = -1;
int res = 0;
int open_mode = O_RDONLY;
char buffer[PIPE_BUF + 1];
int bytes_read = 0;
int bytes_write = 0;
//清空缓冲数组
memset(buffer, '\0', sizeof(buffer));
printf("Process %d finished\n", getpid());
exit(EXIT_SUCCESS);
}
源文件fiforead.c的代码如下:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
(3)命令行模式:输入【: / ?】三个中的任何一个,就可以将光标移动到最底下那一行。
在命令行模式下,可选用以下指令离开vi:
:q!退出,不保存;
:wq保存退出;
4.Linux下的C程序开发
(1)使用touch命令创建c文件hello.c;
(2)使用vi hello.c命令编辑c文件:
#include <stdio.h>
3.VIM编辑器的使用方法
(1)一般模式:以vi打开一个文件就直接进入一般模式了(这是默认的模式)。
(2)编辑模式:在一般模式中可以进行删除、复制、粘贴等的操作,但是却无法编辑文件的内容,只有当到你按下【i, I, o, O, a, A, r, R】等任何一个字母之后才会进入编辑模式。按下【Esc】即可退出编辑模式
1.熟悉进程与程序的区别,加深对进程概念的理解;
2.了解并发进程的执行过程;
3.掌握解决进程互斥使用资源的方法。
【实验内容】
1.编写一段程序,实现进程的管理;
2.编写一段程序实现进程的通信。
【实验环境】(含主要设计设备、器材、软件等)
信息楼505机房
Linux环境
【实验步骤、过程】(含原理图、流程图、关键代码,或实验过程中的记录、数据等)
(5)删除文件:rm要删除的文件名
这里我删除了刚新建的test.txt文件,输入ls命令已查看不到test.txt文件了,证明已删除成功。
(6)查看文件权限:ls -l
可知hello.c文件的权限是644
(7)更改文件权限:chmod文件权限文件名
这里将hello.c文件的权限更改为755,即rwxr-xr-x
1.编写一个程序,创建两个子进程,然后分别在父、子进程中显示它们的进程号,以及对于的父进程号
(1)思路:使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“A”,子进程分别显示字符“b”和“c”。
(2)程序关键代码
fifowrite.c的源代码如下:
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
fclose(out_file);
}
pipe_named_read.c
//从管道文件读信息
int main(){
FILE *in_file;
int count = 1;
char buf[80];
in_file = fopen(“mypipe”, “r”);
if (in_file == NULL){
printf(“Error in fopen. \n”);
printf("Process %d result %d\n", getpid(), pipe_fd);
if(pipe_fd != -1)
{
int bytes_read = 0;
//向数据文件读取数据
bytes_read = read(data_fd, buffer, PIPE_BUF);
buffer[bytes_read] = '\0';
#include<stdio.h>
main(){
int p1,p2;
if(p1=fork())/*子进程创建成功,如果失败fork函数会返回一个负值*/
putchar('b');
else{
if(p2=fork())/*子进程创建成功,如果失败fork函数会返回一个负值*/
putchar('c');
else putchar('A');/*父进程执行*/
//累加写的字节数,并继续读取数据
bytes_sent += res;
bytes_read = read(data_fd, buffer, PIPE_BUF);
buffer[bytes_read] = '\0';
}
close(pipe_fd);
close(data_fd);
}
else
exit(EXIT_FAILURE);
while(bytes_read > 0)
{
//向FIFO文件写数据
res = write(pipe_fd, buffer, bytes_read);
if(res == -1)
{
fprintf(stderr, "Write error on pipe\n");
exit(EXIT_FAILURE);
}
#include <sys/types.h>
#include <sys/stat.h>
#include <limits.h>
#include <string.h>
int main()
{
const char *fifo_name = "/home/c/my_fifo";
int pipe_fd = -1;
2.熟悉常用的Shell操作命令
(1)查看系统分区情况:fdisk -l
(2)查看当前运行级别:runlevel
可知,当前运行级别为:5
(3)将当前运行级别改变为3:init 3
运行后的结果如下图:
输入命令runlevel查看当前运行级别可知为3
(4)新建文件:touch文件名
这里创建了一个文件名为test.txt的文件
//向管道文件写信息
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main(){
FILE * out_file;
int count = 1;
char buf[80];
out_file = fopen(“mypipe”,”w”);
if (out_file==NULL){
printf(“Error opening pipe”);
exit(1);
}
sprintf(buf, ”this is the test data for the named pipe example \n”);
fwrite(buf,1,88,out_file);
在实验的过程中,我用的是VM虚拟机和redhat操作系统(linux系统中的一种),学会了如何在虚拟机上安装并运行linux操作系统,也熟悉了Linux字符操作界面和常用的shell命令。虽然我一开始从图形操作界面转到命令行操作界面多少有些不适应,但随着对命令行的熟悉应用,发现也没那么难,只是命令行太多了会记不住。与此同时,第一次在linux系统下编写c程序,感觉用vi比较麻烦,因为有错了不能调试,只是提示错误。不过此次实验要求掌握编写并运行一个简单的c程序,我就直接输出一句话就好了,所以不需要怎么调试了,直接用gcc编译并运行。在这实验的过程中,加深了对一些术语的理解,也让我学到了新的知识。
printf("Process %d result %d\n",getpid(), pipe_fd);
if(pipe_fd != -1)
1. Linux字符操作界面;
2. Shell操作命令;
3. VIM编辑器的使用方法;
4. Linux下的C程序开发。
【实验环境】(含主要设计设备、器材、软件等)
计算机C语言编程软件redhat操作系统VM虚拟机
【实验步骤、过程】(含原理图、流程图、关键代码,或实验过程中的记录、数据等)
1.同时按住“Ctrl+Alt+Shift+F2”键进入字符操作界面;
printf("Process %d opening FIFO O_RDONLY\n", getpid());
//以只读阻塞方式打开管道文件,注意与fifowrite.c文件中的FIFO同名