minitalk 프로젝트는 SIGUSR1과 SIGUSR2 신호를 사용하여 프로세스 간에 메시지를 전송할 수 있는 클라이언트와 서버를 구현합니다. 클라이언트가 서버로 텍스트 메시지를 보내면, 서버는 이를 받아 터미널에 출력합니다.
minitalk 프로젝트는 **프로세스 간 통신(IPC)**과 유닉스 신호에 대한 이해를 목표로 합니다. 클라이언트와 서버가 SIGUSR1과 SIGUSR2 신호를 통해 메시지를 비트 단위로 주고받으며, 서버는 수신된 메시지를 터미널에 출력합니다.
- 서버: 클라이언트가 전송한 메시지를 수신하고, 이를 터미널에 출력합니다.
- 클라이언트: 특정 메시지를 서버로 전송합니다. 이때, 서버의 프로세스 ID(PID)를 알아야 합니다.
- 신호 전송:
SIGUSR1과SIGUSR2를 사용하여 데이터를 비트 단위로 전달합니다. - 확인 응답: 서버는 각 비트를 수신한 후, 클라이언트에 응답 신호를 보내 정확한 전송이 이루어졌음을 알립니다.
minitalk 프로젝트에서는 유닉스 신호를 사용하여 0과 1의 비트를 전송함으로써 텍스트 데이터를 전달합니다. 각 문자는 ASCII 값으로 변환된 후 이진법으로 표현되며, 비트 단위로 신호를 통해 전달됩니다.
- 문자에서 비트 변환:
- 각 문자를 이진법으로 변환하여 8개의 비트로 분리합니다.
- 비트별 전송:
- 비트가
0이면SIGUSR1신호를,1이면SIGUSR2신호를 서버에 전송합니다.
- 비트가
- 수신 확인:
- 서버는 각 비트를 수신한 후, 클라이언트에 응답 신호를 보내 전송이 성공적으로 이루어졌음을 확인합니다.
- 종료 신호:
- 메시지의 모든 비트를 전송한 후, 클라이언트는 NULL 문자(
\0)를 전송하여 서버가 메시지의 끝을 인식하게 합니다.
- 메시지의 모든 비트를 전송한 후, 클라이언트는 NULL 문자(
이 과정을 통해 메시지가 올바르게 전송되고, 서버는 이를 출력합니다.
- 비트 단위 전송: 클라이언트는 메시지를 하나의 문자씩, 각 문자를 8개의 비트로 변환하여 서버에 전송합니다.
- 신호 대기: 서버는 특정 PID에서 오는
SIGUSR1또는SIGUSR2신호를 대기하고 있으며, 수신한 신호에 따라 0과 1을 구분합니다. - 응답 신호: 서버가 각 비트를 수신하면 클라이언트에 응답 신호를 보내어 전송이 성공적으로 이루어졌음을 알립니다. 이 과정을 통해 서버는 비트를 순서대로 재조립하여 메시지를 완성합니다.
- 종료 처리: 클라이언트는 모든 문자를 전송한 후 종료 신호(
\0)를 보내며, 서버는 이를 확인하면 메시지 수신을 종료하고 현재의 메시지를 출력합니다.
-
터미널에서 이 저장소를 클론합니다.
git clone https://github.com/jmsmg/minitalk.git cd minitalk -
프로젝트를 빌드합니다.
make
-
컴파일이 완료되면
server와client실행 파일이 생성됩니다.
먼저, 서버를 실행하여 프로세스 ID(PID)를 확인합니다. 서버는 이 PID를 통해 클라이언트와의 통신을 허용합니다.
./server서버가 실행되면 PID가 터미널에 표시됩니다. 클라이언트는 이 PID를 사용하여 서버로 메시지를 전송할 수 있습니다.
클라이언트를 실행하여 메시지를 서버로 전송합니다. server_pid에는 서버의 PID를 입력하고, "message"에는 보내고자 하는 메시지를 입력합니다.
./client <server_pid> "Hello, Minitalk!"예를 들어, 서버 PID가 12345라면 다음과 같이 메시지를 전송합니다.
./client 12345 "Hello, Minitalk!"서버는 수신한 메시지를 터미널에 출력합니다.