我正在尝试了解命名信号和未命名信号量之间的相似点和不同点,因此我的谷歌搜索产生了this。我对页面上的措辞有疑问,但它说:
这两个词是否会在这两种信号量之间产生任何重要的区别,或者它们是否无关紧要?
到目前为止,这就是我所拥有的:
Similarities
-Several processes can do something with the semaphore
Difference
-Named are referenced with pathname and unnamed are referenced by pshared value
这就是我从那个定义中可以收集的全部内容。是这一切,他们是正确的吗?或者我错过了一些重要的概念?
答案 0 :(得分:18)
考虑谁可以访问信号量。
未命名的信号量(缺少任何名称或句柄来定位它们)必须存在于某些预先存在的,商定的内存位置。在子进程的情况下,通常是(1)共享内存(由fork
之后的子进程继承);或者(2)共享内存,全局变量或在单个进程的线程之间共享它们的堆。这里必不可少的是父,子或线程中的代码已经知道信号量的地址。
命名信号量对于不相关的进程是必需的。例如,生产者和消费者可能由两个不同的开发人员编写,并作为完全不相关的进程运行。但是他们必须分享一些需要信号量保护的资源。命名信号量为它们提供了信号量的路径。
实际上,您可以在所有场景中使用命名信号量,但它们带来一些额外的包袱,因为您必须处理路径和权限,如果程序相关并且已经知道如何访问未命名的路径和权限则不需要信号。例如,使用命名信号量在线程之间共享资源有点愚蠢。线程已经可以访问未命名的信号量可以驻留的相同内存。
答案 1 :(得分:5)
接受的答案是错误的(以及@electron给出的另一个答案)。未命名的POSIX信号量可以由不相关的进程使用。您只需将数据结构存储在相关进程可访问的共享内存中,并将shareable标志设置为1来启动它,如此处所示(从http://blog.superpat.com/2010/07/14/semaphores-on-linux-sem_init-vs-sem_open/无耻地复制):
int shm;
sem_t * mutex;
if ((shm = shm_open("myshm", O_RDWR | O_CREAT, S_IRWXU)) 0) {
perror("shm_open");
exit(1);
}
if (ftruncate(shm, sizeof(sem_t)) < 0 ) {
perror("ftruncate");
exit(1);
}
if ((mutex = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED, shm, 0)) == MAP_FAILED) {
perror("mmap");
exit(1);
}
if (sem_init(mutex, 1, 1) < 0) {
perror("semaphore initialization");
exit(1);
}
将共享内存映射到其地址空间的另一个进程可以访问同一个信号量并与原始进程同步。另请参阅sem_init()及其linux man page的POSIX规范。
答案 2 :(得分:-2)
命名信号量 actual name
中有一个file system
,多个 不相关的进程可以shared
强>
未命名的信号量只能由属于 相同流程 的threads
使用。
信号量使用函数创建
其中 ptr_semaphore :指向信号量的指针 标志:表示共享级别的标志 initial_value :信号量的初始值 如果您将 传递非零值, sem init(ptr_semaphore, flag, initial_value);
flag=0
传递给sem_init()
,则信号量可以
仅由属于创建信号量的进程的线程共享。因此,它将创建 unamed semaphore 。 sem_init(ptr_semaphore,0,initial_value) //unamed semaphore
allow
其他进程也可以访问信号量。因此,它将导致命名信号量。 sem_init(ptr_semaphore,1,initial_value) //named semaphore