[Linux] Signal과 Socket 통신 비교

mommers·2026년 2월 3일

Linux

목록 보기
33/59

리눅스에서 Signal과 Socket 통신 비교


1. 시그널 = 초인종, 소켓 = 우편물

Signal: 초인종

  • 내용물은 없고 "누군가 왔다(이벤트 발생)"는 사실만 즉시 알리고 끝납니다.
  • 받는 사람이 뭘 하고 있든 강제로 중단시키고 벨을 울립니다. (비동기)

Socket: 우편함

  • 실제 편지(데이터)가 담겨 있습니다.
  • 받는 사람이 시간 날 때 우편함을 열어봐야 합니다. (동기/비동기 선택 가능)

2. 두 통신의 선택 기준(Deep Dive)

비교 항목SignalSocket (Unix Domain)
핵심 역할제어 (Control) 및 인터럽트데이터 전송 (Transport)
데이터 크기없음 (또는 정수 하나)제한 없음 (Byte Stream)
전달 보장낮음 (표준 시그널은 중복 발생 시 하나로 뭉쳐짐 - Coalescing)높음 (버퍼에 큐잉됨)
네트워크불가능 (OS 커널 내 한정)가능 (로컬 및 원격)
주 사용처데몬 리로드(SIGHUP), 강제 종료(SIGKILL), 자식 관리(SIGCHLD)로그 전송, DB 연결, 프로세스 간 데이터 파이프라인

3. Signal을 사용하는 이유

  1. 커널이 주는 유일한 알람:
    • CPU 명령어가 0으로 나누기를 하거나(SIGFPE), 메모리를 잘못 건드렸을 때(SIGSEGV), 커널이 프로세스에게 알려주는 유일한 수단입니다. 소켓으로는 이 정보를 받을 수 없습니다.
  2. 구현 비용 0 :
    • 소켓을 쓰려면 socket(), bind(), connect(), accept() 등 코드가 길어집니다.
    • 시그널은 kill(pid, SIGUSR1) 한 줄이면 끝납니다. 단순 트리거용으로는 가성비가 최고입니다.
  3. 관리자 제어 표준:
    • 시스템 관리자나 스크립트가 외부에서 kill 명령어로 프로세스를 제어하는 표준 인터페이스입니다.

4. 시그널의 한계 (Senior Level)

  1. 정보 소실 (Coalescing)
  • 프로세스가 바쁜 사이에 SIGUSR1이 100번 도착해도, 핸들러는 딱 1번만 실행될 수 있습니다. (표준 시그널은 큐에 쌓이지 않음).
  • 반면 소켓은 데이터가 버퍼에 쌓이므로 소실되지 않습니다.
  1. 비동기 처리의 위험성
  • 핸들러 내부에서는 할 수 있는 일이 극히 제한적입니다.
    (예를 들어printf, malloc 사용 불가).
profile
임베디드 개발자가 되기 위해 공부중입니다!

0개의 댓글