Android/User Daemon

Android Daemon을 위한 기본 C/C++ 코드 작성

임베디드 친구 2025. 6. 16. 20:24
728x90
반응형

Android Daemon을 위한 기본 C/C++ 코드 작성

Android에서 NDK를 활용하여 사용자 정의 Daemon을 만드는 방법에 대해 설명합니다. Daemon은 백그라운드에서 실행되며, 시스템 종료 또는 특정 조건이 발생하지 않는 한 계속 실행되는 프로세스입니다. 본 글에서는 Android NDK를 이용하여 Daemon을 작성하는 방법과 주요 개념을 다룹니다.

1. 기본적인 Daemon 구조

Android에서 Daemon을 생성하기 위해서는 다음과 같은 기본 구조를 따라야 합니다.

  1. 프로세스를 fork()하여 부모 프로세스를 종료합니다.
  2. setsid()를 호출하여 새로운 세션을 생성하고 터미널로부터 분리합니다.
  3. 필요하면 다시 fork()하여 새로운 프로세스를 생성합니다.
  4. 표준 입력(stdin), 표준 출력(stdout), 표준 에러(stderr)를 /dev/null로 리디렉션합니다.
  5. 무한 루프 또는 특정 조건이 충족될 때까지 동작하도록 코드를 작성합니다.

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을 개발하고 활용할 수 있을 것입니다.

728x90
반응형