본문 바로가기
직장⊙자기 계발

Linux 프로세스 이해: fork, exec, 백그라운드, 데몬, 시그널 총정리

by 동동이y 2025. 6. 16.
728x90
728x90

리눅스 프로세스 & 시그널 완전정복! 포그라운드·백그라운드·fork·exec·데몬·신호 정리

리눅스에서 **프로세스(Process)**는 사용자가 실행한 프로그램 하나하나를 가리키는 매우 중요한 개념입니다.
이 글에서는 포그라운드와 백그라운드, fork()와 exec(), **데몬(Daemon)**까지 다루며,
마지막엔 **시그널(signal)**에 대해서도 정리할게요.
이 글 하나면 리눅스 프로세스 제어와 시그널 이해는 걱정 끝! 😎


💡 1. 포그라운드(Foreground) vs 백그라운드(Background)

✅ 포그라운드 프로세스

✅ 백그라운드 프로세스

  • 터미널에 붙지 않고 백그라운드에서 실행됩니다
  • 명령어 끝에 &를 붙이면 백그라운드 실행이 가능하며, 입력/출력 없이 혼자 돌아갑니다
  • 예를 들면 long_running_command &처럼 쓰면 됩니다. ✅

👍 TIP: Ctrl + Z로 프로세스를 멈춘 후 bg, fg 명령으로 백그라운드↔포그라운드 간 전환도 할 수 있어요 unix.stackexchange.comlaughcryrepeat.tistory.com


🏗️ 2. fork()와 exec(): 새로운 프로세스 생성과 실행

🧬 fork()

c
 
pid_t pid = fork();

🏃 exec()

c
 
execl("/bin/ls", "ls", "-l", NULL);
  • 현재 프로세스 메모리 공간에 다른 프로그램을 덮어쓰기(overwrite) 합니다
  • fork()와 함께 사용되는 것이 일반적이며 man7.org+4stackoverflow.com+4en.wikipedia.org+4
  • exec() 호출 후에는 PID는 그대로 유지하지만, 메모리 구조가 새 프로그램으로 바뀝니다

🔄 fork + exec 구조 활용

리눅스 셸(예: Bash)은 외부 명령어 실행 시엔 아래 과정을 거칩니다:

  1. fork()로 자식 프로세스 생성
  2. 자식 프로세스에서 exec()로 실제 명령어 실행
  3. 부모는 wait()를 통해 자식 종료 대기 en.wikipedia.org+14en.wikipedia.org+14yeondong.tistory.com+14reddit.com+1s905060.gitbooks.io+1

이 구조는 새로운 프로세스 관리의 기본이 됩니다.


👻 3. 데몬(Daemon): 백그라운드 서비스 프로세스

  • 시스템 부팅 시 자동 실행, 사용자 요청 시 동작, 메모리에 상주하는 백그라운드 프로세스입니다 won21yuk.github.io+5yeondong.tistory.com+5velog.io+5
  • 주요 종류:
    • Standalone daemon: 독립형으로 항상 메모리에 있음
    • inetd(xinetd) 기반 데몬: 다른 서비스들을 on-demand로 중계하는 슈퍼 데몬 yeondong.tistory.com
  • 예: httpd, mysqld, sshd 같은 서비스가 여기에 속합니다

🛠️ 데몬 변수:

  • 부모 프로세스는 PID 1(init)입니다
  • 부모가 죽어도 데몬은 살아있으며, 자식 재생성 및 로그 관리를 독립적으로 수행합니다

🚨 4. 시그널(signal): 프로세스 통신의 핵심 메커니즘

시그널은 프로세스 간 또는 시스템에서 보내는 이벤트 알림입니다.
예: kill, Ctrl+C, Ctrl+Z, 세션 종료 등 다양한 의미를 가집니다 yeondong.tistory.com

🔔 주요 시그널

시그널                        설명                                                                                  기본 동작
SIGHUP 터미널 종료 시 세션 재시작 통보 데몬 재기동
SIGINT Ctrl + C 입력 프로세스 중단
SIGQUIT Ctrl + \ 입력 종료 + 코어 덤프
SIGKILL 강제 종료 요청 강제 종료 (무시 불가)
SIGTERM 일반적 종료 요청 언젠간 종료
SIGTSTP Ctrl + Z 입력 중지 → bg 또는 fg로 복귀
 

⚡ 프로그래밍에서의 시그널 처리

  • signal() 또는 sigaction()을 통해 핸들러를 등록하여
    특수 상황(예: SIGHUP)에서 특정 동작 수행
  • SIGCHLD는 자식 프로세스가 종료됐을 때 부모에게 알려줌

 


⚙️ 프로세스 흐름 예시: 로그 기록 데몬

bash
 
#!/bin/bash
# fork 데몬화 예제 ( while true; do echo "$(date): alive" >> /var/log/mydaemon.log sleep 60 done )& disown
  • &를 사용해 백그라운드 실행 후 disown을 통해 터미널과 완전 분리 (SIGHUP 무시)
  • 쉘이 종료되어도 데몬이 계속 작동합니다

🧩 이처럼 포그라운드, 백그라운드, 데몬, fork/exec, 시그널 개념이 모두 연계되어 돌아간답니다!


 핵심 요약 정리

  • Foreground: 사용자와 직접 상호작용하는 프로세스
  • Background: 터미널과 별도로 실행되는 프로세스 (&)
  • fork(): 부모 프로세스 복제 → 자식 생성
  • exec(): 프로세스 코드 덮어쓰기 → 새 프로그램 실행
  • Daemon: 백그라운드에서 지속 실행되는 서비스 프로세스
  • Signal: 프로세스 간 이벤트 전달 (예: SIGINT, SIGTERM 등)
728x90
반응형

댓글