2016-02-24 97 views
1

我想使用POSIX命名信號來確保我的可執行程序只有一個實例可以運行。但我遇到了麻煩;信號量的值始終爲0,因此它總是阻塞。命名爲POSIX信號量的問題

#include <semaphore.h> /* required for semaphores */ 
#include <stdio.h> 
#include <unistd.h>  /* usleep */ 
#include <fcntl.h>  // O_EXCL 
#include <assert.h> 
#include <stdlib.h>  /* exit, EXIT_FAILURE */ 


int main(int argc, char *argv[]) 
{ 
    int ret; 
    int i; 
    sem_t* semaphore; 

    semaphore = sem_open("/mysemaphore", O_EXCL, 0777 /*0644*/, 2); 
    printf("sem_open returned %p at line %u\n", semaphore, __LINE__); 

    // if it exists, open with "open", and parameters will be ignored (therefore given as 0) 
    if(!semaphore) 
    { 
    semaphore = sem_open("/mysemaphore", O_CREAT, 0, 0); 
    printf("sem_open returned %p at line %u\n", semaphore, __LINE__); 
    } 

    // either of the above calls should have given us a valid semaphore 
    assert(semaphore); 

    // read its value time and again 
    ret = sem_getvalue(semaphore, &i); 
    printf("sem_getvalue returned %i at line %u, value is %i\n", ret, __LINE__, i); 

// .... 

輸出:

sem_open returned 0x8003a4e0 at line 36 
sem_getvalue returned 0 at line 50, value is 0 

平臺:Cygwin的1.7.33-2

內置用這個命令:

gcc Main.c -o Main -lpthread 

幫助非常感謝!

+0

信號燈將在開始時的0值是否有任何地方的任何代碼,實際上增加(調用sem_post( ))在你的信號量? – nos

回答

1

使用sem_post(semaphore)增加,sem_wait(semaphore)減少。

此外,使用O_CREAT時,模式和價值應指定到一些有用的東西:

semaphore = sem_open("/mysemaphore", O_CREAT, 0777, 0); 
+0

非常感謝您回覆我的請求。但是,我不明白你的意思是「模式和值應該指定爲有用的東西」:我將值設置爲1或2,因爲這是我想要的,但它似乎沒有效果。 「價值」和「模式」的正確值是什麼?無論如何,如果值爲0,那麼設置值的目的是什麼? – FreeSpirit64

+0

針對上述情況,根據sem_open()規範,「如果指定了O_CREAT,並且具有給定名稱的信號量已經存在,則模式和值將被忽略。」 (我從[鏈接](http://man7.org/linux/man-pages/man3/sem_open.3.html)複製了此聲明) – FreeSpirit64

+0

我可以確認使用sem_post()我可以增加信號量的值。它沒有回答上面的問題,但它使我能夠向前邁進一點。我現在可以看到的是,當我在程序結束時執行以下操作:'code'(sem_close(semaphore); sem_unlink(「/ mysemaphore」);)並再次運行該程序時,信號量仍然存在,即意外。 – FreeSpirit64