[QUERY] Help With Semaphore Error on Windows : Cygwin
Yeo Kai Wei
yeokaiwei@hotmail.com
Thu Feb 16 04:04:01 GMT 2023
Hi All,
Could I request for some help on some code?
I ran into an error with semaphores with some book code using Cygwin on
Windows.
The code will throw an error with sem_post().
I compiled it with gcc -o memwriter memwriter.c -lrt -lpthread
$ ./memwriter
Shared memory address: 0x6fffffff0000 [0..511]
backing file: /dev/shm/shMemEx
semptr is address 0x7ffffcc18 with value 0
SEM_VALUE_MAX is 1147483648
sem_post: Invalid argument <--------------------------- ERROR
According to feedback, the above error does not turn up on Linux.
May I know if this is supposed to happen on Cygwin on Windows?
If not, how can I solve this?
I've also attached the code for reference.
Thank you.
Kind regards,
YEO Kai Wei
-------------- next part --------------
#define ByteSize 512
#define BackingFile "/shMemEx"
#define AccessPerms 0644
#define SemaphoreName "mysemaphore"
#define MemContents "This is the way the world ends...\n"
-------------- next part --------------
//gcc -o memwriter memwriter.c -lrt -lpthread
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <semaphore.h>
#include <string.h>
#include <limits.h> //SEM_VALUE_MAX
#include "shmem.h"
void report_and_exit(const char* msg)
{
perror(msg);
exit(-1);
}
int main()
{
//Create file descriptor
int fd = shm_open( BackingFile,
O_RDWR | O_CREAT, //Read, write, create if needed
AccessPerms); //Access permission 0644
//ERROR
if(fd<0)
report_and_exit("Can't open shared mem segment ... ");
//Get the bytes
ftruncate(fd, ByteSize);
//Let system pick where to put the segments
caddr_t memptr = mmap( NULL, //Let system pick
ByteSize, //How many bytes
PROT_READ | PROT_WRITE, //Access protections
MAP_SHARED, //Mapping visible
fd, //file descriptor
0); //offset 0, start from 1st byte
if((caddr_t) -1 == memptr)
report_and_exit("Can't get segment...");
fprintf(stderr, "Shared memory address: %p [0..%d]\n", memptr, ByteSize -1);
fprintf(stderr, "backing file: /dev/shm%s\n", BackingFile);
//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)
report_and_exit("sem_open");
//Copy some ASCII Bytes to the memory segment
strcpy(memptr, MemContents);
printf("semptr is address %p with value %i\n", &semptr, semptr);
printf("SEM_VALUE_MAX is %i\n", SEM_VALUE_MAX);
//sem_post increments the semaphore -1 ERROR, 0 success
if(sem_post(semptr) < 0)
report_and_exit("sem_post");
//Sleep
sleep(12);
//Cleanup. Unmap the storage
munmap(memptr, ByteSize);
close(fd);
sem_close(semptr);
//Unlink from backing file
shm_unlink(BackingFile);
return 0;
}
More information about the Cygwin
mailing list