프로세스간 커뮤니케이션

tycode·2021년 5월 9일
0

C.S (Computer Science)

목록 보기
18/40
post-custom-banner

각 IPC 기법관련 시스템콜 사용법 이해

파이프 코드 예제

  • int fd[2] 배열을 2개 만들어서 fd[0],fd[1] 가질 수 있음
  • pipe인자 2개의 배열을 가진 변수가 되기 떄문에 fd넣음 (커널 영역에 생성)
  • 만약 -1이 나오면 파이프 생성 안됐다는 뜻이기 때문에 exit(1)
  • write시스템콜은 fd[1]에 msg를 씀
  • read는 hello child process라는 커널영역에 들어가서 MSGSIZE만큼의 데이터를 buf에 넣고 읽음.

  • 255 사이즘만큼 데이터를 읽고 그 데이터는 Hello Child Process!
  • 부모에서 자식으로 데이터가 넘어온 것을 확인함.

메시지 큐(message queue)

  • msgget이라는 큐를 만들어야함
  • msgflg 설정 옵션
    • IPC_CREAT: 새로운 키면 식별자를 새로 생성, IPC_CREAT|접근권한 ( | = or )
    • 예: IPC_CREAT|0644 → rw-r--r-- (파일처럼 권한 줄 수 있음)

  • msgqid를 보낼 때는 msgsnd 사용
  • msgflg 설정:
    • 블록 모드(0) : 읽을 때까지 대기
    • 비블록 모드(IPC_NOWAIT) : 읽지 않더라도 다음 코드를 실행한다면 IPC_NOWAIT
  • 메세지큐 전송 프로그램 일부 코드 예)

  • 메시지를 받을 때는,

  • msgtyp 설정: 0이면 첫번째 메세지, 양수이면 타입이 일치하는 첫번째 메세지
  • msgflg설정: 블록 모드(0) / 비블록 모드(IPC_NOWAIT)


msgqueuesnd.c

메세지 큐 보낼 때,

msgqueuercv.c

메세지 큐 받을 때,

msgqueuesndrcv.c

하나의 프로세스 안에 메세지큐를 전송하고 받음,

참고: ftok()

  • ftok(): 키 생성을 위한 함수
    • path 경로명의 inode값과 숫자값(id)를 기반으로 키 생성
    • 경로 삭제 후 재생성시 inode값이 달라지므로, 이전과는 다른 키값이 리턴
      • keyfile: 특정 디렉토리 이름

ipcs

어떤 것들이 생성되어 있는지 보여줌.

msgctl

해당 메세지 큐를 삭제한다는 명령

공유 메모리 (shared memory)

  1. 공유 메모리 생성 (shmget)
  1. 공유 메모리 연결 (매핑 shmat)

  2. 공유 메모리 해제 (shmdt)

공유 메모리 읽기/쓰기

마치 포인터 변수처럼 사용하면 됨

  1. 공유 메모리에서 읽기 (printf)

  2. 공유 메모리에 쓰기 (strcpy)

참고: shmctl()

  • msgctl 유사 형태로 공유 메모리 삭제

전체 예시)

시그널(signal)

  • Ctrl + C를 눌러서 프로세스 종료시키기 (시그널 사용의 예)

    Ctrl+C → 시그널 → OS → 프로세스 → 디폴트(종료)
    Ctrl+Z → '' → '' → '' → 디폴트(프로세스를 background로)

시그널 종류: kill -l

시그널 보내기

예)

받은 시그널에 따른 동작 정의


예1) SIGINT를 받으면 SIG_IGN(무시해라)
예2) SIGINT를 받으면 프로그램 안에서 signal_handler함수를 호출해라 (기본 동작 아닌 재정의한 동작)

예제)

signal_handler (함수 이름 임의로 바꿀 수 있음)

post-custom-banner

0개의 댓글