项目 内容
这个作业属于哪个课程 班级课程的主页链接
这个作业的要求在哪里 作业要求链接接地址
学号-姓名 18043229-朱帅华
作业学习目标 1、了解进程间通信的常用方式;2、掌握管道、消息队列、信号量、共享内存实现进程间通信的方法。

实验内容

1、举例说明使用匿名管道进行进程通信。

  • 匿名管道
    当进程使用pipe函数,就可以打开位于内核中的这个特殊“文件”。同时pipe函数会返回两个描述符,一个用于读,一个用于写。如果你使用fstat函数来测试该描述符,可以发现此文件类型为FIFO。而无名管道的无名,指的就是这个虚幻的“文件”,它没有名字。
    pipe函数打开的文件描述符是通过参数(数组)传递出来的,而返回值表示打开成功(0)或失败(-1)。
    它的参数是一个大小为2的数组。此数组的第0个元素用来接收以读的方式打开的描述符,而第1个元素用来接收以写的方式打开的描述符。也就是说,pipefd[0] 用于读的,而pipefd[1]是用于写的。
    打开了文件描述符后,就可以使用read(pipefd[0])write(pipefd[1])来读写数据了。
    例题: 父进程fork出一个子进程,通过无名管道向子进程发送字符,子进程收到数据后将字符串中的小写字符转换成大写并输出。


  • 文件属性前面标注的文件类型是p,代表管道
  • 文件大小是 0
  • fifo文件需要有读写两端,否则在打开fifo文件时会阻塞
    例题:编写两个程序,分别是发送端 pipe_send 和接收端面pipe_recv。程序pipe_send从标准输入接收字符,并发送到程序pipe_recv,同时pipe_recv将接收到的字符打印到屏幕。



    打开两个终端分别运行pipe_sendpipe_recv,此时会阻塞,然后在pipe_send的终端输入数据,此时pipe_recv会有对应的输出。

2、IPC内核对象

例题:程序ipccreate用于在指定的键值上创建ipc内核对象。使用格式为./ipccreate,比如./ipccreate 0 0x8888表示在键值0x8888上创建共享内存。

获取ipc内核对象

程序ipcget用于在指定的键值上获取ipc内核对象的id号。使用格式为./ipcget,比如./ipcget 0 0x8888表示获取键值0x8888上的共享内存id号。

3、共享内存

例题:编写一个程序shmctl可以用来创建、删除内核对象,也可以挂接、卸载共享内存,还可以打印、设置内核对象信息。具体使用方法具体见下面的说明:
./shmctl -c: 创建内核对象。
./shmctl -d: 删除内核对象。
./shmctl -v: 显示内核对象信息。
./shmctl -s: 设置内核对象(将权限设置为0600)。
./shmctl -a: 挂接和卸载共享内存(挂接5秒后,再执行shmdt,然后退出)。

先在另一个终端执行./shmctl -a,然后在当前终端执行./shmctl -v

4、消息队列

例题:程序msg_sendmsg_recv分别用于向消息队列发送数据和接收数据。msg_send程序定义了一个结构体Msg,消息正文部分是结构体Person。该程序向消息队列发送了10条消息。





5、信号量

例题:信号量操作 示例

例题:使用信号量实现父子进程之间的同步,防止父子进程抢夺CPU。

posted on 2021-06-13 11:20  雨雨子  阅读(23)  评论(0编辑  收藏  举报