suminworld-system-lab/signal-demo at main · sumin-world/suminworld-system-lab
System programming & networking lab (C, Linux, OSTEP practice) - sumin-world/suminworld-system-lab
github.com
프로젝트 구성
signal_demo.c는 다음 기능을 포함합니다:
- SIGINT/SIGTSTP 핸들링 (Ctrl+C, Ctrl+Z)
- SIGALRM 타이머 처리
- SIGUSR1/SIGUSR2 사용자 정의 시그널
- Job control 예제
- 자동화 테스트 모드
대화형 메뉴를 통해 각 기능을 실행하며 동작을 확인할 수 있습니다. 로컬에서는 정상 작동했으나 CI 환경에서는 문제가 발생했습니다.
발생한 문제들
1. 실행 권한 오류
test.sh 스크립트에 실행 권한이 없어 CI 실패가 발생했습니다.
해결: chmod +x test.sh 후 커밋
2. 무한 대기
프로그램이 대화형 메뉴 입력을 기다리며 무한 블로킹되었습니다.
========================================
Signal Handling Demo
========================================
Choice (0-7): ← 무한 대기
CI는 사용자 입력을 제공할 수 없어 10분 이상 실행 후 타임아웃으로 실패했습니다.
3. Timeout Exit Code
timeout 명령어 사용 시 exit code 124가 발생하여 정상 완료된 테스트도 실패로 판정되었습니다.
핵심: CI 환경은 interactive 입력을 지원하지 않습니다.
해결 방법
1. 파이프 입력
- name: Run auto_test non-interactively (60s timeout)
run: |
printf "7\n0\n" | timeout 60s ./signal_demo
- 메뉴 7번(자동 테스트), 0번(종료) 자동 입력
- stdin 파이프로 입력 주입
- 60초 timeout 설정
2. EOF 처리
if (scanf("%d", &choice) != 1) {
int ch;
if (feof(stdin)) {
printf("\nEOF detected. Exiting.\n\n");
return 0;
}
// 에러 처리
}
파이프 종료 시 EOF로 인한 무한 루프를 방지했습니다.
3. 테스트 최적화
- name: Run auto_test fast (60s timeout)
env:
DEMO_FAST: "1"
run: |
printf "7\n0\n" | timeout 60s ./signal_demo
DEMO_FAST 환경변수로 CI용 빠른 테스트 모드를 구현했습니다.
프로젝트 구조
suminworld-system-lab/
└─ signal-demo/
├─ signal_demo.c
├─ test.sh
├─ Makefile
└─ .github/workflows/c-build.yml
- make: 컴파일
- make test: 자동 테스트
- git push: CI 자동 실행
결과 비교
❌ 실패 상태 (초기)
Failing 상태 – 메뉴 입력 대기 중 타임아웃 발생

초기에는 무한 대기와 exit code 124 문제로 지속적인 실패가 발생했습니다.
✅ 성공 상태 (개선 후)
Passing 상태 – CI 배지가 녹색으로 표시됨

파이프 입력과 timeout 설정 후 정상적으로 passing 상태를 확인할 수 있었습니다.
학습 내용
- CI/CD 환경 특성: Interactive 입력 대신 자동화된 입력 방식 필요
- EOF 처리: 파이프 종료 시 무한 루프 방지 필수
- 효율성: 로컬/CI 환경에 맞는 테스트 모드 분리
- 점진적 개선: 문제를 단계적으로 해결하는 과정의 중요성
- DevOps 실천: 개발 코드를 자동 테스트와 배포 파이프라인까지 연결하는 경험
정리
시스템 프로그래밍 학습용 코드에서 시작해 GitHub Actions CI/CD 자동화 파이프라인 구축까지 확장되었습니다. 이 과정에서 시그널 처리, 쉘 스크립팅, DevOps 실천을 통한 개발 자동화를 경험할 수 있었습니다. Interactive 프로그램의 CI/CD 자동화는 까다로웠지만, 문제 해결 과정에서 실전 DevOps 기술을 체득할 수 있었습니다 🙂
📦 참고 자료
전체 소스코드: GitHub - signal-demo
suminworld-system-lab/signal-demo at main · sumin-world/suminworld-system-lab
System programming & networking lab (C, Linux, OSTEP practice) - sumin-world/suminworld-system-lab
github.com
CI 워크플로우: c-build.yml
suminworld-system-lab/.github/workflows/c-build.yml at main · sumin-world/suminworld-system-lab
System programming & networking lab (C, Linux, OSTEP practice) - sumin-world/suminworld-system-lab
github.com
'system' 카테고리의 다른 글
| Rust for Linux: 커널 개발을 위한 3가지 핵심 언어 기능 (0) | 2025.10.29 |
|---|---|
| 사이드 채널 공격(Side Channel Attack): Flush+Reload로 캐시 접근 패턴 들여다보기 (0) | 2025.09.20 |
| 🛡️SGI 서울보증 랜섬웨어 사건 정리 & 리눅스 백신 실습 (1) | 2025.09.16 |
| [Linux Signal] - 쉘, 프로세스 제어, 시그널 핸들링 (0) | 2025.09.14 |
| [시스템 프로그래밍] myshell.c 코드 분석 - 2 (1) | 2025.09.12 |