2017-2018-1 20155308 《信息安全系统设计基础》第十周课上+课下测试
程序运行
- 理解test.c, 说出程序功能
- 编译运行程序,提交运行截图
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
main()
{
int fd ;
int newfd;
char line[100];
fgets( line, 100, stdin ); printf("%s", line );
fgets( line, 100, stdin ); printf("%s", line );
fgets( line, 100, stdin ); printf("%s", line );
fd = open("data", O_RDONLY);
newfd = dup2(fd,0);
if ( newfd != 0 ){
fprintf(stderr,"Could not duplicate fd to 0\n");
exit(1);
}
close(fd);
fgets( line, 100, stdin ); printf("%s", line );
fgets( line, 100, stdin ); printf("%s", line );
fgets( line, 100, stdin ); printf("%s", line );
}
- 程序功能为:
1、首先采集三次用户输入并打印出来
2、以只读的方式打开data文件,记为fd
3、用newfd复制fd中的文件并打印用户输入,失败,输出“不能复制fd”
- 编译运行程序
stat命令的实现-mysate
学习使用stat(1),并用C语言实现
- 提交学习stat(1)的截图
- man -k ,grep -r的使用
- 伪代码
- 产品代码 mystate.c,提交码云链接
- 测试代码,mystat 与stat(1)对比,提交截图
- 利用
man
命令学习stat(1),man 1 stat
man -k stat
伪代码:获取stat结构体并打印
产品代码码云链接
https://gitee.com/haowenfei25/XinXiAnQuanXiTongSheJiJiChu20155308/blob/master/ketang/stat.c
- mystat 与stat(1)对比
课下作业-IPC
研究Linux下IPC机制:原理,优缺点,每种机制至少给一个示例,提交研究博客的链接
- 共享内存
- 管道
- FIFO
- 信号
- 消息队列
介绍
在linux下的多个进程间的通信机制叫做IPC(Inter-Process Communication),它是多个进程之间相互沟通的一种方法。在linux下有多种进程间通信的方法:半双工管道、命名管道、消息队列、信号、信号量、共享内存、内存映射文件,套接字等等。使用这些机制可以为linux下的网络服务器开发提供灵活而又坚固的框架。
共享内存
原理:共享内存是在多个进程之间共享内存区域的一种进程间的通信方式,由IPC为进程创建的一个特殊地址范围,它将出现在该进程的地址空间(这里的地址空间具体是哪个地方?)中。其他进程可以将同一段共享内存连接到自己的地址空间中。所有进程都可以访问共享内存中的地址,就好像它们是malloc分配的一样。如果一个进程向共享内存中写入了数据,所做的改动将立刻被其他进程看到。
- 优缺点:共享内存是IPC最快捷的方式,因为共享内存方式的通信没有中间过程,而管道、消息队列等方式则是需要将数据通过中间机制进行转换。共享内存方式直接将某段内存段进行映射,多个进程间的共享内存是同一块的物理空间,仅仅映射到各进程的地址不同而已,因此不需要进行复制,可以直接使用此段空间。
- 例子:一个进程write存储输入,一个进程将读出共享内存中的数据
生成共享内存
文件为:sharememory1.c
码云链接:
- 获取共享内存
文件为:sharememory2.c
码云链接:
- 结果:
管道
原理:管道实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另一进程就可以从管道的另一端将其读取出来。
- 优缺点:管道是由内核管理的一个缓冲区,一个缓冲区不需要很大,它被设计成为环形的数据结构,以便管道可以被循环利用。当管道中没有信息的话,从管道中读取的进程会等待,直到另一端的进程放入信息。当管道被放满信息的时候,尝试放入信息的进程会等待,直到另一端的进程取出信息。当两个进程都终结的时候,管道也自动消失。
管道只能在本地计算机中使用,而不可用于网络间的通信。 - 例子:一个进程向管道文件中写数据,一个进程将读出数据
向管道文件中写数据
文件为:PIPE1.c
码云链接:
- 从管道文件中读数据
文件为:PIPE2.c
码云链接:
- 结果
FIFO
原理:命名管道(FIFO)是一种特殊类型的文件,它在系统中以文件形式存在。这样克服了管道的弊端,他可以允许没有亲缘关系的进程间通信。
- 例子:一个进程向文件中写数据,一个进程将读出数据并丢弃
向命名管道文件中写数据
文件为:FIFO1.c
码云链接:
- 从命名管道文件中读数据并丢弃
文件为:FIFO2.c
码云链接:
- 结果
信号
- 原理:信号机制是unix系统中最为古老的进程之间的通信机制,用于一个或几个进程之间传递异步信号。信号可以有各种异步事件产生,比如键盘中断等。shell也可以使用信号将作业控制命令传递给它的子进程。
优缺点:对于命名管道FIFO来说,IO操作和普通管道IO操作基本一样,但是两者有一个主要的区别,在命名管道中,管道可以是事先已经创建好的
例子
文件为:signal.c
码云链接:
- 结果
消息队列
原理:消息队列是内核地址空间中的内部链表,通过linux内核在各个进程直接传递内容,消息顺序地发送到消息队列中,并以几种不同的方式从队列中获得,每个消息队列可以用IPC标识符唯一地进行识别。内核中的消息队列是通过IPC的标识符来区别,不同的消息队列直接是相互独立的。每个消息队列中的消息,又构成一个独立的链表。
优缺点:消息队列克服了信号承载信息量少,管道只能承载无格式字符流。命名管道相比,消息队列的优势在于:1、消息队列也可以独立于发送和接收进程而存在,从而消除了在同步命名管道的打开和关闭时可能产生的困难。2、同时通过发送消息还可以避免命名管道的同步和阻塞问题,不需要由进程自己来提供同步方法。3、接收程序可以通过消息类型有选择地接收数据,而不是像命名管道中那样,只能默认地接收。
代码中运行的问题
在课堂实验第二部分,设计mystat时,编译通过后,如果要运行“1.txt”文件,一定要加上文件的名称,即
./stat 1.txt
而不是
./stat
感受
这次的课堂实验测试了我们学习的内容,感觉我自己在新理解一个事物的时候还是不能很好地利用它,所以第二项测试没有完整地提交,而且完成的程度也不太好。
通过课下练习,我重新学习了Linux下IPC机制:原理,优缺点。我通过对这几种机制的了解和学习,更好地掌握了这方面的知识。