터미널에서 미니 대화창을 구현해보자:)
dqQQQ
·2023. 11. 26. 19:23
개요
이 프로젝트의 목적은 유닉스 signals를 이용해서 데이터를 주고받는 프로그램을 작성하는 것이다.
과제를 해결하기 위한 사전지식
signal 함수
서로 다른 서버가 데이터를 주고 받기 위해서는 시그널 함수가 필요하다.
kill 함수
서로 다른 서버가 데이터를 주고 받기 위해서는 킬 함수가 필요하다.
kill 함수는 특정 서버로 신호를 보내는 함수이다. 그렇기 때문에 데이터를 주는 쪽에서 사용했다.
bitmask
문자를 받아서 다른 서버로 보내는 과제이다.
문자는 1바이트로 8개의 비트로 이루어져있다. 이 비트들은 1과 0으로 구성되는데 이때 해당 비트가 1인지 0인지 구분하기 위해서 사용한다.
signal
시그널을 이용해서 서로 다른 서버가 데이터를 주고 받기 위해서는 signal함수와 kill함수가 필요하다.
이것들에 대해 간략하게 알아보겠다.
void (signal(int signum, void (handler)(int)))(int);
Parameter
int signum
: 감지할 시그널 플래그void (*handler)(int)
: 시그널을 감지하면 실행할 함수
Description
프로그램이 실행하는 동안 지정한 플래그가 감지되면 지정한 함수를 실행
How to use
void sig_handler(int signum);
signal(SIGUSR1, sig_handler);
signal(SIGUSR2, sig_handler);
signal 함수 자체가 특정 플래그를 인식하면 지정된 함수를 실행하는 역할을 하므로 데이터를 받는 쪽에서 사용했다.
많은 옵션들이 있지만 이 과제를 위해서는 사용자 임의 옵션 2개가 필요하다. SIGUSR1, SIGUSR2
이 옵션들은 값을 보내는 것이 아니라 서로 다른 신호만 보낸다. 그 신호들을 인식해서 데이터로 바꿔주는 작업은 내가 해야한다.
나는 SIGUSR1를 인식하면 1, SIGUSR2를 인식하면 0으로 처리했다.
int kill(pid_t pid, int sig);
Parameter
pid_t pid
: 시그널을 보낼 서버의 pidint sig
: 보낼 시그널
Description
pid에 해당하는 서버로 sig신호를 보냄
How to use
if (i == 1)
kill(12345, SIGUSR1);
else
kill(12345, SIGUSR2);
kill 함수는 특정 서버로 신호를 보내는 함수이다.
그렇기 때문에 데이터를 주는 쪽에서 사용했다.
int pause(void);
Parameter
void
Description
시그널을 감지 때까지 대기
How to use
signal(SIGUSR1, sig_handler);
while(1)
pause();
My Minitalk
구조는 위의 사진과 같다.
'42Seoul' 카테고리의 다른 글
정렬된 스택을 만들기 위한 명령어들을 만들어보자:) (0) | 2023.11.26 |
---|---|
터미널에서 미니 게임을 구현해보자:) (0) | 2023.11.26 |
가변인자와 printf 함수의 형식지정자에 대해서 알아보자:) (0) | 2023.11.26 |
도커를 공부해보자:) (0) | 2023.11.26 |
리눅스의 모니터링 스크립트를 만들어보자:) (0) | 2023.11.26 |