Unix signal을 이용해 스스로 대화 해보기.

koeyhoyh·2022년 5월 26일
0

42Seoul

목록 보기
11/11

목표 :

Unix Signal USRSIG1, USRSIG2를 이용해 통신하는 클라이언트와 서버를 만든다.
송-수신 확인


사전지식

사용 가능한 함수
int kill(pid_t pid, int sig)

pid가 양수이면, sig 시그널을 pid로 보냄.
pid가 0이면, 현재 프로세스가 속한 프로세스 그룹의 모든 프로세스에게 sig 시그널을 보낸다.
pid가 -1보다 작으면, pid 프로세스가 포함된 모든 그룹의 프로세스에세 sig 시그널을 보낸다.

int sigaction(int sig, const struct sigaction restrict act, struct sigaction restrict oact)

sigaction 함수를 사용하기 위해서는 sigaction 구조체가 필요하다.

참고 : https://velog.io/@two_jay/sigaction

신호를 받을 때 "받은 신호를 원하는 대로 처리할 수 있게 만들어주는", 함수 (+구조체를 이용한)

구조체에서는 sa_handler 대신, 핸들러를 원하는 함수로 바꿀 수 있는 sa_flags = SA_SIGINFO 로 바꾸어주었고,

sa_sigaction = receive_handler() 로 내가 원하는 핸들러 함수로 바꾸어주었다.

Mac OS 에서, pid의 범위는 100 ~ 99998


bonus

송수신 확인 시스템 만들기
: 클라이언트 -> 서버 의 단방향 통신이 아니라, 응답이 끝나고 서버도 잘 받았다는 통신을 한다는 것으로 생각.

클라이언트에도 핸들러를 달아주고, while 문 안에 pause()를 넣어줌으로써 해결했다.

Ascii 뿐만 아니라, Unicode도 처리하기.
: 대부분은, 그리고 클러스터 환경은 UTF-8을 지원하기 때문에, 8비트씩 받던 글자도 그대로 출력해주면 터미널(콘솔)에서 비트가 모이고, Unicode가 처리된다.

Unicode : 보통은 1 ~ 4byte. 영어 뿐만 아니라 전 세계의 글자들을 모두 표현하기 위해 만들어졌다.
2byte 이상의 Unicode는 첫 비트가 11, 111, 1111로 시작하는데, 1로 시작하는 바이트를 만나면 터미널/콘솔은 그 바이트를 저장했다가, 다음 유니코드의 시작을 뜻하지 않는 바이트의 마지막을 만난다면 그 유니코드를 출력한다.
참고 : https://stackoverflow.com/questions/10017328/unicode-stored-in-c-char

profile
내가 만들어낸 것들로 세계에 많은 가치를 창출해내고 싶어요.

0개의 댓글