我想了解有名和无名的信号量之间的异同,所以我的谷歌搜索产生了我这个 。 我有一个关于这些网页上的措辞问题,它说:
- 未命名信号可能由一个以上的过程是可用
- 命名信号是由多个进程共享
难道这两个词创建这两种类型的信号量之间的重要区别或者他们无关?
因此,到目前为止,这是我有:
Similarities
-Several processes can do something with the semaphore
Difference
-Named are referenced with pathname and unnamed are referenced by pshared value
这就是我可以从定义搜集。 就是一切,他们是正确的吗? 还是我错过了一些显著概念?
想想谁可以访问旗语条款。
未命名信号(缺乏任何名义办理找到他们)必须以某种预先存在的存在,商定内存位置。 通常它是(1)共享存储器(通过后孩子继承fork
在子进程的情况下); 或(2)共享存储器,全局变量或在它们被单个进程的线程之间共享的情况下的堆。 这里最根本的区别是,在父母,子女,或线程的代码已经知道信号的地址。
命名信号所必需的不相关的进程。 例如生产者和消费者可能由两个不同的开发人员编写和运行方式完全无关的进程。 但他们必须共享一些资源需要由一个信号量进行保护。 命名的信号量给他们的信号路径。
在现实中,你可以使用在所有方案中一个名为信号,但他们与一点点额外的行李,因为你必须要处理的路径和权限,并且使得是不必要的,如果程序是相关的,已经知道如何访问一个未命名的信号。 这是一个有点傻,例如,使用一个命名信号量线程之间共享的资源。 该线已经可以访问相同的内存,其中一个未命名信号可以驻留。
接受的答案是错的(以及另一个由@electron给出)。 无名POSIX信号可以通过不相关的过程中使用。 你只需要存储在共享内存中的数据结构,由相关进程访问,并设置为一个可共享的标志初始化它,如下所示(无耻地从复制http://blog.superpat.com/2010/07/14/信号量上-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);
}
该共享存储器到其地址空间的另一种方法的映射可以访问同一信号并与原来的处理同步。 也看到了POSIX规范sem_init()和它的Linux手册页 。
命名信号量具有actual name
在file system
,并且可以shared
由多个不相关的进程 。
未命名信号只能由被用来threads
属于相同的处理 。
信号灯使用的函数创建
sem init(ptr_semaphore, flag, initial_value);
哪里
ptr_semaphore:一个指针信号
标志 :指示共享级别的标志
initial_value:信号量的初始值
如果传递flag=0
至sem_init()
然后信号可以仅由属于创建该semaphore.Thus它将创建unamed旗语 的处理线程共享 。
sem_init(ptr_semaphore,0,initial_value) //unamed semaphore
传递非零值将allow
其他进程访问信号为好 。 因此,它会导致命名信号量 。
sem_init(ptr_semaphore,1,initial_value) //named semaphore