c - Posix 与 System V 中基于共享内存的管道之间的区别?

标签 c operating-system posix shared-memory

作为我的家庭作业项目的一部分,我必须实现一个使用共享内存实现管道的库。匿名管道和命名管道。

我选择了 Posix 实现,这意味着我使用了以下调用:

mmap()
shm_open()
ftruncate()
shm_unlink()

For semaphores and synchronization 

sem_init()
sem_getvalue()
sem_wait()
sem_post()

(我可能忘记了一两个电话)

我的助教告诉我,他更喜欢我用 System V 版本实现该库, 然而,由于我正在考试中,我没有额外的时间来做这件事(我想至少需要一周的时间)。

我的问题是:

  1. Posix 中实现的管道与 System-V 中实现的管道有什么区别?
  2. 使用 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/

相关文章:

c - 下载 conio.h 并在 Virtualbox 上使用 GUI

operating-system - 带测试和集合的有界等待互斥

c++ - 使用posix api从线程ID获取线程名称

c - 共享库段错误;无法弄清楚 valgrind 错误

c - 带有未声明变量的 Typedef 结构

c - 为什么 fprintf() 不写入文件?

shell - POSIX:abcdef 到 ab bc cd de ef

c - 操作系统、C 和进程内存分配

linux - Linux 中 GetProcessIoCounters 的等价物是什么?

c - 为什么在多线程服务器中使用 dup(2) 监听套接字?