2017-2018-1 20155308 《信息安全系统设计基础》第十周课上+课下测试

2017-2018-1 20155308 《信息安全系统设计基础》第十周课上+课下测试

程序运行

  1. 理解test.c, 说出程序功能
  2. 编译运行程序,提交运行截图
#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
");
		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语言实现

  1. 提交学习stat(1)的截图
  2. man -k ,grep -r的使用
  3. 伪代码
  4. 产品代码 mystate.c,提交码云链接
  5. 测试代码,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机制:原理,优缺点。我通过对这几种机制的了解和学习,更好地掌握了这方面的知识。

原文地址:https://www.cnblogs.com/JIUSHA/p/7881647.html