实验四 Linux进程互斥
一、实验目的
熟悉Linux下信号量机制,能够使用信号量实现在并发进程间的互斥和同步。
二、实验题目
使用共享存储区机制,使多个并发进程分别模拟生产者-消费者模式同步关系、临界资源的互斥访问关系,使用信号量机制实现相应的同步和互斥。
三、背景材料
(一)需要用到的系统调用
实验可能需要用到的主要系统调用和库函数在下面列出,详细的使用方法说明通过“man 2 系统调用名”或者“man 3 函数名”命令获取。
fork() 创建一个子进程,通过返回值区分是在父进程还是子进程中执行; wait() 等待子进程执行完成;
shmget() 建立一个共享存储区; shmctl() 操纵一个共享存储区;
shmat() 把一个共享存储区附接到进程内存空间;
shmdt() 把一个已经附接的共享存储区从进程内存空间断开;
semget() 建立一个信号量集;
semctl() 操纵一个信号量集,包括赋初值;
semop() 对信号量集进行wait和signal操作; signal() 设置对信号的处理方式或处理过程。
(二)模拟生产者-消费者的示例程序
本示例主要体现进程间的直接制约关系,由于使用共享存储区,也存在间接制约关系。进程分为服务进程和客户进程,服务进程只有一个,作为消费者,在每次客户进程改变共享存储区内容时显示其数值。各客户进程作为生产者,如果共享存储区内容已经显示(被消费),可以接收用户从键盘输入的整数,放在共享存储区。
编译后执行,第一个进程实例将作为服务进程,提示:
ACT CONSUMER!!! To end, try Ctrl+C or use kill.
服务进程一直循环执行,直到用户按Ctrl+C终止执行,或使用kill命令杀死服务进程。 其他进程实例作为客户进程,提示:
Act as producer. To end, input 0 when prompted.
客户进程一直循环执行,直到用户输入0。
示例程序代码如下:
#include
#include
#include
#include
#include
#include
#include
#include