• 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机制:原理,优缺点。我通过对这几种机制的了解和学习,更好地掌握了这方面的知识。

  • 相关阅读:
    排列 POJ
    [kuangbin带你飞]专题二十一 概率&期望 部分题解
    队列最大值&滑动窗口最大值【剑指offer】
    Python实现可视化界面多线程豆瓣电影信息爬虫,并绘制统计图分析结果
    剑指offer【复杂链表的复制】
    树上博弈——从根节点先后走向叶子节点输赢【递归水题】
    给一个长度为n的字符串,找出长度为m的最小字典子序列【单调栈】
    Hrbust 1814 小乐乐的化妆品【01背包】
    Hrbust 1541集合划分 & Hrbust 2002幂集【dp】
    Hrbust 1333 GG的关心【01背包】
  • 原文地址:https://www.cnblogs.com/JIUSHA/p/7881647.html
Copyright © 2020-2023  润新知