使用 posix 未命名信号量的 IPC [关闭]

Posted

技术标签:

【中文标题】使用 posix 未命名信号量的 IPC [关闭]【英文标题】:IPC using posix unnamed semaphores [closed] 【发布时间】:2012-12-18 18:44:20 【问题描述】:

如何实现 使用匿名 posix 信号量的进程中的生产者/消费者问题? (这意味着我需要有 2 个进程依次打印一些文本,第 2 个可以从第 1 个分叉出来)

pthread_t pchild; 
int i = 0; 
pid_t pid; 

sem_init(&fst, 1, 1); 
sem_init(&scnd, 1, 0); 

if((pid = fork()) == 0)  

    while(i<10) 
    sem_wait(&scnd); 
    printf("CHILD\n"); 
    sem_post(&fst); 
i++; 
 
else if(pid != -1)     

while(i<10) 
        sem_wait(&fst); 
        printf("parent\n"); 
        sem_post(&scnd); 
        i++; 
         
else printf("error - fork !!!\n"); 

sem_destroy(&fst); 
sem_destroy(&scnd); 

此代码仅打印 “父母” - 1次, 但我在 oracle 文档http://docs.oracle.com/cd/E19253-01/816-5137/sync-39/index.html 中发现“未命名的信号量是私有的,通过 fork() 继承” 怎么了?


我的解决方案在这里https://www.dropbox.com/s/zzgsyj9rq1ngv0s/ost_13p.c

【问题讨论】:

你能再具体一点吗?不太清楚你在问什么。 2 进程:2nd 是从 1st 分叉的,它们都应该交替打印出一些东西。任务是使用未命名的 posix 信号量来实现。据我了解,共享内存是这种情况的解决方案,但我不知道如何。 【参考方案1】:

在共享内存中分配信号量(如shm_open),然后重试。

sem_init 中设置pshared 参数是不够的。 sem_t * 参数引用的内存也必须在进程之间共享。

【讨论】:

>(as by shm_open) 我必须使用未命名的信号量 信号量将是未命名的。如果共享内存必须是未命名的,请尝试 MAP_ANONYMOUS/MAP_ANON 或映射/dev/zero。如果这不起作用,请在一些类似 mktemp 的名称上使用shm_open(O_EXCL),然后使用shm_unlink()。不完美,但可能完全可以使用。 是的,你说的很对(我读到 sem_open 时缺乏注意) 好吧,我的解决方案在这里dropbox.com/s/zzgsyj9rq1ngv0s/ost_13p.c(也许对某人有用)

以上是关于使用 posix 未命名信号量的 IPC [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Posix信号量

IPC之Posix信号量详解

IPC- Posix与system v

RE:Posix 和 System V IPC

POSIX 信号量

linux里的ipc是啥意思