【问题标题】:Global named event equivalent in UnixUnix 中的全局命名事件等价物
【发布时间】:2011-11-26 08:09:25
【问题描述】:

什么是 Unix 中等效的全局命名事件对象?我需要在 unix 中创建一个命名的类事件对象,以便另一个进程可以设置它

Win32 中的伪代码:

HANDLE hEvent=CreateEvent(...,"Global\\CSAPP");
while(1)
{
    WaitForSingleObject(hEvent);
    ...
}

在另一个进程中:

HANDLE hEvent=OpenEvent(...,"Global\\CSAPP");
SetEvent(hEvent);

【问题讨论】:

    标签: winapi unix synchronization ipc


    【解决方案1】:

    您可能正在寻找named semaphore

    int initial = 0;
    sem_t *sem = sem_open("/global_name", O_CREAT, 0644, initial);
    
    /* Down ("Wait"). */
    sem_wait(sem);
    
    /* Up ("Set") . */
    sem_post(sem);    
    

    【讨论】:

    • @JosephH 调整权限。
    • 不,信号量与事件对象不同,因为它不是二进制的!您可以发出 10 次事件信号,然后等待它并在一个原子操作(重置它)中手动重置它。使用信号量,您必须调用 sem_wait 10 次才能将其重置为零。这不仅效率低下,而且对 sem_wait 的十次调用也不是原子的(可以在中间执行增加信号量计数的操作)。 Linux eventfd 系统调用几乎是你所能得到的,但它没有被命名,所以答案是在 Unix 上没有很好的方法来做到这一点。
    • @MichaelGoldshteyn 感谢您的澄清!
    猜你喜欢
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 2014-02-26
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    相关资源
    最近更新 更多