터미널에서 미니 대화창을 구현해보자:)

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 : 시그널을 보낼 서버의 pid
  • int 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




구조는 위의 사진과 같다.