[QUERY] Help With Semaphore Error on Windows : Cygwin

Yeo Kai Wei yeokaiwei@hotmail.com
Fri Feb 17 04:56:06 GMT 2023


Hi All,

Thanks for the help.

It works now.

So, the 2 things that were required

1. Adding the '/' in front of the semaphore name so that Cygwin can 
recognise it

#define SemaphoreName "/mysemaphore"

2. Changing the if check from if(semptr == (void*) -1) to if(semptr == 
(sem_t*) 0)


Thank you very much, Takashi and Corinna.

Kind Regards,
YEO Kai Wei

On 16/2/2023 10:59 pm, Corinna Vinschen wrote:
> Hi Kai,
>
> Apart from what Takashi already wrote, there's another bug in this code:
>
> On Feb 16 12:04, Yeo Kai Wei via Cygwin wrote:
>> #define ByteSize 512
>> #define BackingFile "/shMemEx"
>> #define AccessPerms 0644
>> #define SemaphoreName "mysemaphore"
>                          ^^^^^^^^^^^^
>
> What Takashi wrote.  The reason that you don't notice that sem_open
> actuially failed is...
>
>> 	//Create the semaphore
>> 	sem_t* semptr = sem_open(	SemaphoreName,//name
>> 					O_CREAT, //create semaphore
>> 					AccessPerms, //protection permissions
>> 					0);	//Initial value
>>
>> 	//ERROR
>> 	if(semptr == (void*) -1)
>                       ^^^^^^^^^^
>                       This.
>
> Why do you test for -1?  If you read the POSIX man page for sem_open,
> you'll see this:
>
>    Upon successful completion, the sem_open() function shall return the
>    address of the semaphore. Otherwise, it shall return a value of
>    SEM_FAILED [...]
>    ^^^^^^^^^^
>
> SEM_FAILED is not necessarily -1.  On Cygwin it's defined as
>
>    #define SEM_FAILED ((sem_t *) 0)
>
> in /usr/include/semaphore.h.
>
> So your code just seems to fail in sem_post, but actually that's
> because sem_open failed and your code checks for the wrong return
> value.
>
>
> HTH,
> Corinna


More information about the Cygwin mailing list