Android Daemon을 위한 기본 C/C++ 코드 작성
Android에서 NDK를 활용하여 사용자 정의 Daemon을 만드는 방법에 대해 설명합니다. Daemon은 백그라운드에서 실행되며, 시스템 종료 또는 특정 조건이 발생하지 않는 한 계속 실행되는 프로세스입니다. 본 글에서는 Android NDK를 이용하여 Daemon을 작성하는 방법과 주요 개념을 다룹니다.
1. 기본적인 Daemon 구조
Android에서 Daemon을 생성하기 위해서는 다음과 같은 기본 구조를 따라야 합니다.
- 프로세스를 fork()하여 부모 프로세스를 종료합니다.
- setsid()를 호출하여 새로운 세션을 생성하고 터미널로부터 분리합니다.
- 필요하면 다시 fork()하여 새로운 프로세스를 생성합니다.
- 표준 입력(stdin), 표준 출력(stdout), 표준 에러(stderr)를 /dev/null로 리디렉션합니다.
- 무한 루프 또는 특정 조건이 충족될 때까지 동작하도록 코드를 작성합니다.
2. fork() 및 setsid()를 이용한 백그라운드 프로세스 생성
다음은 기본적인 Daemon 생성 코드입니다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
void daemonize() {
pid_t pid;
// 첫 번째 fork
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
}
if (pid > 0) {
exit(EXIT_SUCCESS);
}
// 새로운 세션 생성
if (setsid() < 0) {
exit(EXIT_FAILURE);
}
// SIGCHLD, SIGHUP 무시
signal(SIGCHLD, SIG_IGN);
signal(SIGHUP, SIG_IGN);
// 두 번째 fork
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
}
if (pid > 0) {
exit(EXIT_SUCCESS);
}
// 파일 모드 변경
umask(0);
// 루트 디렉터리로 변경
chdir("/");
// 표준 입출력 리디렉션
int fd = open("/dev/null", O_RDWR);
if (fd != -1) {
dup2(fd, STDIN_FILENO);
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
close(fd);
}
}
int main() {
daemonize();
while (1) {
sleep(10); // 백그라운드에서 실행
}
return 0;
}
위 코드에서는 Daemon을 생성하기 위해 fork()
와 setsid()
를 사용하였으며, 표준 입출력을 /dev/null
로 리디렉션하여 독립적으로 실행됩니다.
3. Android에서 Daemon의 생명주기 관리
Android에서는 일반적인 Linux 환경과 달리 Daemon이 시스템 정책에 의해 종료될 가능성이 높습니다. 따라서 Daemon의 생명주기를 관리하는 몇 가지 방법을 고려해야 합니다.
(1) init.rc를 이용한 Daemon 실행
Android의 init.rc
스크립트를 수정하여 Daemon을 자동으로 실행할 수 있습니다. 예제:
service mydaemon /system/bin/mydaemon
class core
user root
group root
oneshot
위 설정을 적용하면, mydaemon
실행 파일이 부팅 시 자동 실행됩니다.
(2) Android Service와 연동
NDK 기반의 Daemon을 Android의 Service와 연동하여 실행하면 더 안정적인 방식으로 관리할 수 있습니다. Java/Kotlin 코드에서 startService()
또는 startForegroundService()
를 호출하여 Daemon과 상호작용할 수 있습니다.
(3) Watchdog을 활용한 자동 재실행
Daemon이 비정상 종료되었을 때 자동으로 재시작하는 Watchdog을 구현할 수도 있습니다. 예제:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
while (1) {
pid_t pid = fork();
if (pid == 0) {
execl("/system/bin/mydaemon", "mydaemon", NULL);
exit(EXIT_FAILURE);
} else if (pid > 0) {
wait(NULL); // Daemon이 종료되면 다시 실행
} else {
exit(EXIT_FAILURE);
}
}
return 0;
}
이와 같은 방식으로 Android에서 NDK 기반의 Daemon을 안정적으로 실행할 수 있습니다.
결론
본 글에서는 Android에서 NDK를 활용하여 Daemon을 만드는 방법에 대해 설명하였습니다. 기본적인 Daemon 구조를 이해하고 fork()
, setsid()
를 이용한 백그라운드 프로세스를 생성하는 방법을 소개하였으며, Android 환경에서 Daemon의 생명주기를 관리하는 다양한 기법을 살펴보았습니다.
이제 위의 내용을 기반으로 사용자 정의 Android Daemon을 개발하고 활용할 수 있을 것입니다.
'Android > User Daemon' 카테고리의 다른 글
Android에서 사용자 정의 Daemon 등록 및 실행 방법 (0) | 2025.06.18 |
---|---|
Android Daemon을 위한 Android.mk 및 CMakeLists.txt 구성 (0) | 2025.06.17 |
Android에서 Daemon이란? (0) | 2025.06.15 |
개발 환경 준비: Android NDK를 이용한 사용자 정의 Android Daemon 구축 (0) | 2025.06.14 |
Android NDK 개요 및 Android Daemon 개념 소개 (0) | 2025.06.13 |