作为我的家庭作业项目的一部分,我必须实现一个使用共享内存实现管道的库。匿名管道和命名管道。
我选择了 Posix
实现,这意味着我使用了以下调用:
mmap()
shm_open()
ftruncate()
shm_unlink()
For semaphores and synchronization
sem_init()
sem_getvalue()
sem_wait()
sem_post()
(我可能忘记了一两个电话)
我的助教告诉我,他更喜欢我用 System V
版本实现该库,
然而,由于我正在考试中,我没有额外的时间来做这件事(我想至少需要一周的时间)。
我的问题是:
- Posix 中实现的管道与 System-V 中实现的管道有什么区别?
- 使用
Sys V
版本实现上述库需要进行哪些调用?
谢谢
最佳答案
关于问题 (1) - 管道的 Posix
实现和管道的 System V
实现之间应该没有区别 - 如果您是使用一组例程实现一个库,那么用户不应该看到两个实现之间有任何差异。
对于开发人员来说,用于 System V 的共享内存调用是:shmget
创建shmat
访问和 shmctl
销毁(shmdt
用于从当前进程取消共享内存段的映射)。
您调用ftok
它将文件名转换为您将使用的 key 。
请注意,关键是区分不同共享内存/信号量项的神奇唯一性项。
要获取信号量,您可以使用 semget
,要锁定和解锁,请使用 semop
要销毁它,您可以使用 semctl
.
System V 信号量和共享内存段可以在程序执行结束后继续存在 - 即,如果程序终止而没有销毁它们,那么它们将保留在系统中,直到以编程方式或使用 ipcrm
被销毁或重新创建。
关于c - Posix 与 System V 中基于共享内存的管道之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11650630/