• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1666
  • Last Modified:

How to share semaphore between processes

How to share semaphore between processes?
eg
static sem_t count_sem;
sem_init(&count_sem,1,3);

How to shared this  &count_sem between processes? So we can synchronise between processes.
0
william007
Asked:
william007
  • 6
  • 5
3 Solutions
 
Infinity08Commented:
Take a look at this wiki article about IPC (InterProcess Communication) :

http://en.wikipedia.org/wiki/Inter-process_communication

There's a few ways to achieve this. Shared memory could be a good option for you :

http://en.wikipedia.org/wiki/Shared_memory

What system/OS are you developing for ?
0
 
william007Author Commented:
I am using Linux fedora core 5.
I just researching for semaphore.h, there is a system call called sem_open to create named semaphore, I think it is possible that we can use that.
0
 
Infinity08Commented:
If all you want to share between the processes is that semaphore, then that's indeed an option.

More info for that on the man page for sem_open :

http://www.penguintutor.com/man/man.php?topic=sem_open§ion=3


    sem_t *sem = sem_open("/tmp/semname", O_CREAT, 0644, 0);
    if (sem == SEM_FAILED) {
      perror("sem_open() failed ");
    }

Chec kthe man pages for your system to get the implementation you'll use.
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
william007Author Commented:
>sem_t *sem = sem_open("/tmp/semname", O_CREAT, 0644, 0);
This gives me segmentation fault
>sem_t *sem = sem_open("semname", O_CREAT, 0644, 0);
This Works ok.

What is the reason"?
0
 
william007Author Commented:
Code
====
#include <semaphore.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
static sem_t *count_sem;
int main(int argc, char* argv[]){
char* semName=argv[1];
mode_t mode=0777;
unsigned int maxProcess=3;
unsigned int i=O_CREAT|O_EXCL;
int value=0;
count_sem=sem_open(semName,i,mode,maxProcess);
if (count_sem==(void *)-1){
printf("Error create named semaphore\n");
exit(1);
}
while(1){
      sem_getvalue(count_sem,&value);
      printf("value=%d\n",value);
      sem_wait(count_sem);
}


}

Several Test Results
================
[root@localhost Desktop]# ./sem "/tmp/name1"
Segmentation fault
[root@localhost Desktop]# ./sem "/tmp/name2"
Segmentation fault
[root@localhost Desktop]# ./sem "/tmp/name3"
Segmentation fault
[root@localhost Desktop]# ./sem "sem1"
Segmentation fault
[root@localhost Desktop]# ./sem "sem2"
value=3
value=2
value=1
value=0

[root@localhost Desktop]# ./sem "sem2"
Segmentation fault
[root@localhost Desktop]# ./sem "sem3"
value=3
value=2
value=1
value=0
0
 
Infinity08Commented:
I guess your implementation doesn't support slashes other than the first. Try :

    sem_t *sem = sem_open("/semname", O_CREAT, 0644, 0);

The leading slash is to make sure that other processes will refer to the same named semaphore when using "/semname".
Although your implementation might not need the leading slash either. For that you'll have to check the man pages on your system.
0
 
william007Author Commented:
Now I have faced a big problem...How to clean up the named semaphore that I have created and forget to clear? What is the proper way to actually clean up with code?
0
 
william007Author Commented:
*What is the proper way to actually clean up the semaphore in the  code?
0
 
Infinity08Commented:
And about your last post (with the code)

From the man pages :

    "If O_EXCL and O_CREAT are set, sem_open() fails if the semaphore name exists."

Don't set both :)

Also, don't compare with (void *)-1 to check for errors, use SEM_FAILED for that as in my earlier example - it's a lot more portable.
0
 
Infinity08Commented:
>> *What is the proper way to actually clean up the semaphore in the  code?
Use sem_close to close the semaphore in each process, and sem_unlink in the process that actually created it (to remove it from the file system).

    sem_close(sem);
    sem_unlink("/semname");

Don't forget to check the return codes !
0
 
william007Author Commented:
Thanks=)
0

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

  • 6
  • 5
Tackle projects and never again get stuck behind a technical roadblock.
Join Now