팀장: 안민철 (anmincheol-71)
팀원: 백승찬 (kairos1228)
제출일: 2025년 12월 4일
본 프로젝트는 실제 하드웨어 없이 순수 소프트웨어로 스마트팜 환경을 시뮬레이션하는 시스템입니다. UNIX 시스템 프로그래밍에서 학습한 다양한 기술들을 종합적으로 활용하여, 센서-서버-액추에이터로 구성된 IoT 시스템을 가상으로 구현하였습니다.
- System V IPC (Message Queue, Shared Memory, Semaphore) 활용
- 프로세스 생성 및 관리 (fork, wait, signal)
- 파이프를 통한 프로세스 간 통신
- POSIX 스레드 (pthread) 활용
- 시스템 정보 조회 (uname, getpid 등)
- 파일 입출력을 통한 로그 기록
- 가상 물리 엔진: 단순 난수가 아닌 뉴턴 냉각 법칙을 적용한 온도 변화 시뮬레이션
- 실시간 모니터링: ANSI Escape Code를 활용한 컬러풀한 대시보드 UI
- 안전한 종료: Graceful Shutdown으로 모든 프로세스 자동 종료
시스템은 4개의 독립적인 프로세스로 구성되며, System V IPC를 통해 통신합니다.
┌─────────────────────────────────────────────────────────────────────┐
│ Virtual SmartFarm System │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ [P1] SENSOR Message Queue [P3] SERVER │
│ ┌───────────┐ ────────────────────▶ ┌──────────────────┐ │
│ │ 🌡️ 온도 │ (센서 데이터) │ Main Process │ │
│ │ 💧 습도 │ │ └─ fork() ──▶ Child (로그 기록) │
│ │ ⚙️ 물리엔진 │ │ └─ pthread ──▶ Thread (경고) │
│ └─────┬─────┘ └────────┬─────────┘ │
│ │ │ │
│ │ ┌─────────────────────────────────┤ │
│ │ │ Shared Memory │ │
│ │ │ • 임계값 (temp/humidity) │ │
│ │ │ • 제어 상태 (heater/fan/led) │ │
│ │ │ • 현재 센서값 │ │
│ │ │ • system_running (종료 신호) │ │
│ │ │ ⬆️ Semaphore 동기화 │ │
│ │ └─────────────────────────────────┘ │
│ ▼ │ │ │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│ │ [P1] │ │ [P2] │ │ [P4] │ │
│ │ SENSOR │◀──────│ ACTUATOR │ │ MONITOR │ │
│ │ 제어상태 │ │ 대시보드 │ │ 설정/정보 │ │
│ │ 읽기 │ │ UI │ │ │ │
│ └───────────┘ └───────────┘ └───────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
| 프로세스 | 역할 | 사용 기술 |
|---|---|---|
| [P1] Sensor | 가상 센서 데이터 생성, 물리 엔진 | Message Queue, Shared Memory |
| [P2] Actuator | 제어 장치 상태 표시, 대시보드 | Shared Memory, Semaphore |
| [P3] Server | 중앙 제어, 로그 기록, 경고 | fork, pipe, pthread, IPC 전체 |
| [P4] Monitor | 사용자 설정, 시스템 정보 | Shared Memory, Semaphore, select, uname |
- Message Queue: 센서 → 서버로 센서 데이터(온도, 습도) 전송
- Shared Memory: 임계값, 제어 상태, 현재 센서값 공유
- Semaphore: 공유 메모리 접근 시 Race Condition 방지
- Pipe: 서버(부모) → 로그 프로세스(자식) 간 로그 데이터 전송
서버 프로세스는 fork()와 pthread를 활용하여 다음과 같이 구성됩니다:
- 메인 프로세스: 센서 데이터 수신, 제어 로직 처리
- 자식 프로세스 (fork): 파이프에서 데이터를 읽어 로그 파일에 기록
- 경고 스레드 (pthread): 3초마다 임계값 초과 여부 확인 및 경고 출력
| 주차 | 기술 | 적용 내용 |
|---|---|---|
| 5-6주 | 파일 I/O | fopen, fprintf로 smartfarm.log 기록 |
| 7주 | 시스템/프로세스 정보 | uname(), getpid(), getppid(), getuid() |
| 9주 | 프로세스 생성 | fork()로 로그 기록 자식 프로세스 생성 |
| 10주 | 쓰레드 | pthread로 경고 모니터링 스레드 구현 |
| 11주 | 시그널 | signal()로 SIGINT/SIGTERM 처리 |
| 12주 | 파이프 | pipe()로 부모-자식 간 로그 데이터 전송 |
| 13주 | System V IPC | Message Queue, Shared Memory, Semaphore |
- IPC 생성: msgget(), shmget(), semget()
- IPC 조작: msgsnd(), msgrcv(), shmat(), shmdt(), semop()
- 프로세스: fork(), wait(), waitpid(), getpid(), getppid()
- 스레드: pthread_create(), pthread_join(), pthread_self()
- 시그널: signal(), SIGINT, SIGTERM
- 파이프: pipe(), read(), write(), close()
- 파일 I/O: fopen(), fprintf(), fflush(), fclose()
- 시스템 정보: uname(), getuid(), getgid()
- 기타: select() - 논블로킹 입력 처리
- 운영체제: Ubuntu 24.04 (VirtualBox)
- 컴파일러: GCC
- 언어: C (표준 라이브러리 + pthread)
$ make allmake 명령으로 모든 실행 파일이 bin/ 디렉토리에 생성됩니다.
4개의 터미널을 열고 다음 순서로 실행합니다:
# Terminal 1 (먼저 실행 - IPC 자원 생성)
$ ./bin/server
# Terminal 2
$ ./bin/sensor
# Terminal 3
$ ./bin/actuator
# Terminal 4
$ ./bin/monitor서버 터미널에서 Ctrl+C를 누르면 Graceful Shutdown이 실행됩니다:
- 경고 스레드 종료
- Shared Memory에 종료 신호 전송
- 센서, 액추에이터, 모니터 프로세스 자동 종료
- 로그 프로세스 종료 및 파일 저장
- IPC 자원 정리
- 온도 임계값 설정 (20~40°C)
- 습도 임계값 설정 (30~90%)
- 현재 설정 및 상태 확인
- 시스템 정보 확인 (uname)
- 종료
- 시스템 정보 출력 (OS, 호스트명, 아키텍처, PID)
- IPC 자원 생성 메시지
- 로그 프로세스 및 경고 스레드 생성 메시지
- 센서 데이터 수신 및 제어 명령 출력
- PID 표시
- IPC 연결 성공 메시지
- 1초마다 센서 데이터 전송 로그
- 제어 상태 변경 메시지
- 현재 환경: 온도, 습도 (임계값 표시)
- 장치 상태: 히터, 팬, LED (ON/OFF 컬러 표시)
- 1초마다 자동 갱신
- PID 및 부모 PID 표시
- CLI 메뉴 인터페이스
- 시스템 정보 (OS, 호스트명, 아키텍처, 사용자 정보)
========== 로그 시작: Thu Dec 4 15:30:00 2025
시간 온도(°C) 습도(%) 히터 팬
----------------------------------------------------
2025-12-04 15:30:01 25.20 50.30 ON OFF
2025-12-04 15:30:02 25.40 50.60 ON OFF
2025-12-04 15:30:03 25.60 50.90 ON OFF
========== 로그 종료: Thu Dec 4 15:35:00 2025
virtual-smartfarm/
├── Makefile # 빌드 자동화
├── README.md # 프로젝트 문서
├── include/
│ └── common.h # 공통 헤더
├── src/
│ ├── main_sensor.c # 센서 프로세스
│ ├── main_actuator.c # 액추에이터 프로세스
│ ├── main_server.c # 서버 프로세스
│ └── main_monitor.c # 모니터 프로세스
├── bin/ # 실행 파일
└── smartfarm.log # 로그 파일
작성자: 안민철, 백승찬
작성일: 2025-12-04