각 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값이 달라지므로, 이전과는 다른 키값이 리턴
ipcs
어떤 것들이 생성되어 있는지 보여줌.
msgctl
해당 메세지 큐를 삭제한다는 명령
공유 메모리 (shared memory)
- 공유 메모리 생성 (shmget)
-
공유 메모리 연결 (매핑 shmat)
-
공유 메모리 해제 (shmdt)
공유 메모리 읽기/쓰기
마치 포인터 변수처럼 사용하면 됨
-
공유 메모리에서 읽기 (printf)
-
공유 메모리에 쓰기 (strcpy)
참고: shmctl()
- msgctl 유사 형태로 공유 메모리 삭제
전체 예시)
시그널(signal)
- Ctrl + C를 눌러서 프로세스 종료시키기 (시그널 사용의 예)
Ctrl+C → 시그널 → OS → 프로세스 → 디폴트(종료)
Ctrl+Z → '' → '' → '' → 디폴트(프로세스를 background로)
시그널 종류: kill -l
시그널 보내기
예)
받은 시그널에 따른 동작 정의
예1) SIGINT를 받으면 SIG_IGN(무시해라)
예2) SIGINT를 받으면 프로그램 안에서 signal_handler함수를 호출해라 (기본 동작 아닌 재정의한 동작)
예제)
signal_handler (함수 이름 임의로 바꿀 수 있음)