728x90
728x90
리눅스 프로세스 & 시그널 완전정복! 포그라운드·백그라운드·fork·exec·데몬·신호 정리
리눅스에서 **프로세스(Process)**는 사용자가 실행한 프로그램 하나하나를 가리키는 매우 중요한 개념입니다.
이 글에서는 포그라운드와 백그라운드, fork()와 exec(), **데몬(Daemon)**까지 다루며,
마지막엔 **시그널(signal)**에 대해서도 정리할게요.
이 글 하나면 리눅스 프로세스 제어와 시그널 이해는 걱정 끝! 😎
💡 1. 포그라운드(Foreground) vs 백그라운드(Background)
✅ 포그라운드 프로세스
- 사용자가 터미널에서 실행한 대화형 프로세스
- 실행 중엔 터미널이 차단되어, 명령이 끝날 때까지 기다려야 합니다 unix.stackexchange.com+8yeondong.tistory.com+8velog.io+8won21yuk.github.io
- 일반 ls, vim, ping 같은 명령어가 여기에 해당해요.
✅ 백그라운드 프로세스
- 터미널에 붙지 않고 백그라운드에서 실행됩니다
- 명령어 끝에 &를 붙이면 백그라운드 실행이 가능하며, 입력/출력 없이 혼자 돌아갑니다
- 예를 들면 long_running_command &처럼 쓰면 됩니다. ✅
👍 TIP: Ctrl + Z로 프로세스를 멈춘 후 bg, fg 명령으로 백그라운드↔포그라운드 간 전환도 할 수 있어요 unix.stackexchange.comlaughcryrepeat.tistory.com
🏗️ 2. fork()와 exec(): 새로운 프로세스 생성과 실행
🧬 fork()
c
pid_t pid = fork();
- **현재 프로세스(부모)**를 복제해 **새로운 자식 프로세스(child)**를 생성합니다
- 두 프로세스는 거의 같은 코드와 메모리를 공유하며, 결과값으로 자식은 0 반환, 부모는 자식 PID 반환 unix.stackexchange.com+15yeondong.tistory.com+15tae-yeong.tistory.com+15en.wikipedia.org+1stackoverflow.com+1
- 코드 흐름을 분기할 수 있어서, 동시에 두 개의 동작을 수행하거나 병렬처리 시 유용합니다
🏃 exec()
c
execl("/bin/ls", "ls", "-l", NULL);
- 현재 프로세스 메모리 공간에 다른 프로그램을 덮어쓰기(overwrite) 합니다
- fork()와 함께 사용되는 것이 일반적이며 man7.org+4stackoverflow.com+4en.wikipedia.org+4
- exec() 호출 후에는 PID는 그대로 유지하지만, 메모리 구조가 새 프로그램으로 바뀝니다
🔄 fork + exec 구조 활용
리눅스 셸(예: Bash)은 외부 명령어 실행 시엔 아래 과정을 거칩니다:
- fork()로 자식 프로세스 생성
- 자식 프로세스에서 exec()로 실제 명령어 실행
- 부모는 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
반응형
'직장⊙자기 계발' 카테고리의 다른 글
리눅스 파일 시스템 관리 명령어 총정리! mount부터 fsck까지 한 번에 배우기 (0) | 2025.06.18 |
---|---|
리눅스 텍스트 에디터 완벽 가이드 – vi, vim, nano부터 emacs까지 한눈에! (1) | 2025.06.17 |
리눅스 환경변수 완전정복! 전역변수, 셸 변수부터 설정파일, Bash 기능까지 한눈에 (0) | 2025.06.15 |
리눅스 쉘 완전 정복! Bash vs Zsh vs Fish 종류별 비교와 사용법까지! (1) | 2025.06.14 |
리눅스 파일 시스템 완전 정복! ext4, XFS, Btrfs 종류별 차이와 관리법 총정리 (0) | 2025.06.12 |
댓글