콘텐츠로 바로가기

now0930 일지

이런저런 생각

  • 홈
  • 비공개
  • 강좌
  • 잔여 작업 조회
  • 위치

다른 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

이 글 공유하기:

  • Tweet
발행일 2020-07-20글쓴이 이대원
카테고리 생활코딩 태그 c, linux, network program, semaphore

댓글 남기기응답 취소

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

글 내비게이션

이전 글

memory based semaphore, unix network programming p241

다음 글

shared memory introduction, p303 ~ p315

2025 5월
일 월 화 수 목 금 토
 123
45678910
11121314151617
18192021222324
25262728293031
4월    

최신 글

  • common mode, differential mode 2025-05-11
  • signal conditioner, 신호 처리기 2025-05-10
  • strain gage 2025-05-09
  • 칼만 필터 2025-05-01
  • positioner(I/P) 2025-04-26

카테고리

  • 산업계측제어기술사
  • 삶 자국
    • 책과 영화
    • 투자
  • 생활코딩
    • LEGO
    • ROS
    • tensorflow
  • 전기기사
  • 피아노 악보

메타

  • 로그인
  • 엔트리 피드
  • 댓글 피드
  • WordPress.org

페이지

  • 소개
  • 잔여 작업 조회
    • 작업 추가
    • 작업의 사진 조회
    • 작업 수정 페이지
  • 사진
    • GPS 입력된 사진
    • 사진 조회
  • 위치
    • 하기 휴가 방문지
    • 해외 출장

태그

android bash c docker driver FSM gps java kernel LEGO linux mysql network program opcua open62541 plc programmers python raspberry reinforcementLearning ros state space system program tensorflow transfer function 경제 미국 민수 삼국지 세계사 실기 에너지 역사 유전자 일본 임베디드 리눅스 전기기사 조선 중국 채윤 코딩 테스트 통계 한국사 한국어

팔로우하세요

  • Facebook
now0930 일지
WordPress로 제작.