信号量:PV操作,对进程进行同步。
共享内存
正常情况下,将一块物理内存分配给A进程,是不能够同时分配给B进程(一个物理进程只能属于某一个进程)。两个进程是相互独立,A进程结束,释放内存,不会影响其他进程。
如何将同一个物理空间映射到不同的逻辑地址空间?
执行代码ipcs,显示消息队列,共享内存和信号量
如果仅仅想看共享内存,则执行代码:ipcs -m
创建共享内存空间,代码如下:
我们可以发现,共享内存空间已经创建完成,运行结果如下:
手动移除内存空间代码:ipcrm -m 28
共享内存创建成功之后,该如何使用呢?在共享内存中存入字符hello,代码如下:
从上面的运行结果可以发现:hello已经成功写入,接下来用test.c 进程打印,代码如下:
运行结果:
test.c能够读取到main.c中写入的hello,即可说明这两个进程访问的是同一块物理内存空间。
能否做到像管道一样,循环写入数据,并循环读取呢?代码如下:
运行结果:
如何做到输入一次数据,读取一次,当没有写入数据时,则不写入数据。下面将用信号量来解决这个问题。具体代码如下:
将上面的程序直接用在main.c和test.c程序中。即可让main输入一次数据,test输出一次数据。
在程序main.c中,仅仅增加了第20行的初始化,第26行的p操作以及第28行的v操作。test.c的代码如下:
在test.c中,仅仅增加了第19行的初始化,第22行的p操作,第28行的v操作以及第31行的销毁操作。
消息队列:
执行代码ipcs,显示消息队列,共享内存和信号量
如果仅仅想看共享内存,则执行代码:ipcs -s
在a程序中添加消息,具体代码如下:
添加消息后,运行一次的结果为:
运行两次的结果为:
在b程序中读取消息,具体代码如下:
运行结果:
原来是两个消息,运行b.c读取,运行一次则表示读取一个消息,以此类推。
将b.c中的读取消息类型的第20行改为0,则表示可以读取任意类型的消息;
运行结果: