다른 process간 named semaphore 사용(실패)

세마포어로 데이터를 전달할 줄 알았으나, 동기화만 한다. 프로세스간 데이터를 공유할 방법이 없다. 다음 예제 shared memory로 공유한다. named semaphore는 잘 동작하는 듯 한데, 검증을 못했다.

pi@raspberrypi:~/Project/cCode/IPC $ cat named_semaphore_prod.c 
/* include main */
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <semaphore.h>
#include <sys/stat.h>
#include <errno.h>
#include <signal.h>
#define	NBUFF	 10
#define	SEM_MUTEX	"mutex"	 	/* these are args to px_ipc_name() */
#define	SEM_NEMPTY	"empty"
#define	SEM_NSTORED	"nstored"
#define SEM_PROGEND "end"

int		nitems;					/* read-only by producer and consumer */
struct {	/* data shared by producer and consumer */
  int	buff[NBUFF];
  sem_t	*mutex, *nempty, *nstored, *endprog;
} shared;


static void signal_hanlder (int signo)
{
/*
* Technically, you shouldn't use printf() in a
* signal handler, but it isn't the end of the
* world. I'll discuss why in the section
* "Reentrancy."
*/
  if(signo == SIGINT){
    printf ("Caught SIGINT!\ndelete named semaphore\n");
	sem_unlink(SEM_MUTEX);
	sem_unlink(SEM_NEMPTY);
	sem_unlink(SEM_NSTORED);
	sem_unlink(SEM_PROGEND);
    exit (EXIT_SUCCESS);
  }
}

int
main(int argc, char **argv)
{
	int		i, items;
	errno=0;

//if (argc != 2)
//		perror("usage: prodcons1 <#items>");
//	nitems = atoi(argv[1]);
		/* 4create three semaphores */

	//무한 루프에서 세마포어 동작..
	//signal handler로 삭제필요.

	if(signal(SIGINT, signal_hanlder) == SIG_ERR){
		fprintf(stderr, "cannot handle SIGINT\n");
		exit(EXIT_FAILURE);
	}


	shared.mutex = sem_open(SEM_MUTEX, O_CREAT | O_EXCL, 0660, 1);
	if(shared.mutex == SEM_FAILED && errno == EEXIST ){
		printf("delete existing semaphore mutex\n");
		sem_unlink(SEM_MUTEX);
		shared.mutex = sem_open(SEM_MUTEX, O_CREAT | O_EXCL, 0660, 1);
	} //if

	shared.nempty = sem_open(SEM_NEMPTY, O_CREAT | O_EXCL, 0660, NBUFF);
	if(shared.nempty== SEM_FAILED && errno == EEXIST ){
		printf("delete existing semaphore nempty\n");
		sem_unlink(SEM_NEMPTY);
		shared.nempty = sem_open(SEM_NEMPTY, O_CREAT | O_EXCL, 0660, NBUFF);
	} //if

	shared.nstored = sem_open(SEM_NSTORED, O_CREAT | O_EXCL, 0660, 0);
	if(shared.nstored== SEM_FAILED && errno == EEXIST ){
		printf("delete existing semaphore nstored\n");
		sem_unlink(SEM_NSTORED);
		shared.nstored = sem_open(SEM_NSTORED, O_CREAT | O_EXCL, 0660, 0);

	} //if

	shared.endprog = sem_open(SEM_PROGEND, O_RDONLY);
	if(shared.endprog== SEM_FAILED && errno == EEXIST ){
		printf("delete existing semaphore endprog\n");
		sem_unlink(SEM_PROGEND);
		shared.endprog = sem_open(SEM_PROGEND, O_RDONLY);

	} //if
	//sem_getvalue(shared.endprog, &items);
	//printf("producer. items are %d.\n",items);


	while(1){

		sem_wait(shared.nempty);	/* wait for at least 1 empty slot */
		sem_wait(shared.mutex);
		shared.buff[i % NBUFF] = i;	/* store i into circular buffer */
		items--;
		sem_post(shared.mutex);
		sem_post(shared.nstored);	/* 1 more stored item */


		//프로그램 end 확인.
		//consum에서 nitems를 받지 말고,
		//동기화 잘 된다는 생각으로
		//prod, consum 양쪽 카운터..
		//목표 카운터 도달하면 모두 종료.
		//if(items<=0) break;
		
	}

	sem_unlink(SEM_MUTEX);
	sem_unlink(SEM_NEMPTY);
	sem_unlink(SEM_NSTORED);
	sem_unlink(SEM_PROGEND);


	return 0;
}
pi@raspberrypi:~/Project/cCode/IPC $ cat named_semaphore_consu.c
/* include main */
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <semaphore.h>
#include <sys/stat.h>
#include <errno.h>

#define	NBUFF	 10
#define	SEM_MUTEX	"mutex"	 	/* these are args to px_ipc_name() */
#define	SEM_NEMPTY	"empty"
#define	SEM_NSTORED	"nstored"
#define SEM_PROGEND "end"

int		nitems;					/* read-only by producer and consumer */
struct {	/* data shared by producer and consumer */
  int	buff[NBUFF];
  sem_t	*mutex, *nempty, *nstored, *endprog;

} shared;

int
main(int argc, char **argv)
{
	int		i;

	if (argc != 2)
		perror("usage: prodcons1 <#items>");
	nitems = atoi(argv[1]);
		/* 4create three semaphores */
	shared.mutex = sem_open(SEM_MUTEX, O_RDWR);
	shared.nempty = sem_open(SEM_NEMPTY, O_RDWR);
	shared.nstored = sem_open(SEM_NSTORED, O_RDWR);
	shared.endprog = sem_open(SEM_PROGEND, O_CREAT | O_EXCL, 0660, nitems);
	if(shared.endprog == SEM_FAILED && errno == EEXIST ){
		printf("delete existing semaphore endprog\n");
		sem_unlink(SEM_PROGEND);
		shared.endprog = sem_open(SEM_PROGEND, O_CREAT | O_EXCL, 0660, nitems);

	} //if

	for (i = 0; i < nitems; i++) {

		sem_wait(shared.nstored);		/* wait for at least 1 stored item */
		sem_wait(shared.mutex);

		if (shared.buff[i % NBUFF] = i)
			printf("buff[%d] = %d\n", i, shared.buff[i % NBUFF]);
		sem_post(shared.mutex);
		sem_post(shared.nempty);		/* 1 more empty slot */
		
	}
	return 0;
}
https://stackoverflow.com/questions/32205396/share-posix-semaphore-among-multiple-processes

코멘트

댓글 남기기

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.