linux c Daemon 에서 exec 호출 시 대상이 실행되지 않습니다.
글쓴이: pingye / 작성시간: 수, 2023/07/26 - 2:24오후
안녕하세요.
Linux 에서 Daemon을 만들고 있습니다.
문의 드릴 내용은 관련 Daemon에서 다른 Daemon을 주기적으로 확인 후 종료 시 재 시작을 시키려고 합니다.
문제점은 execv 함수 호출 시 호출은 성공하나 실행 시킨 대상이 실행되지 않는 것입니다.
daemon 작업(daemon_work)을 진행 하지 않으면 정상적으로 실행 됩니다.
Linux 프로그램을 시작한지 얼마 되지 않아 이렇게 도움을 받고자 글을 올립니다.
테스트를 위해 작업 중인 소스를 아래 올립니다.
감사합니다
[CODE]
#include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include <signal.h> void daemon_work() { int nFd; const int nMaxFd = 64; pid_t nPid; nPid = fork(); if ( nPid < 0 ) exit(1); if ( nPid > 0 ) /* parent process teminates */ exit(0); setsid(); nPid = fork(); if ( nPid < 0 ) exit(1); if ( nPid > 0 ) /* parent process teminates */ exit(0); chdir("/"); umask(0); /* close out the standard file descriptors */ freopen("/dev/null", "r", stdin); freopen("/dev/null", "w", stdout); freopen("/dev/null", "w", stderr); /* close all file descriptor */ for (nFd=3; nFd<nMaxFd; nFd++) close(nFd); } int main(int argc, char *argv[]) { char **new_argv; char command[] = "rotD"; int idx; int p_stat; daemon_work(); umask(0); pid_t pid; printf ("argc = %d\n", argc); new_argv = (char **)malloc(sizeof(char *) * (argc + 1)); new_argv[0] = command; new_argv[1] = NULL; pid = fork(); if (pid < 0) { free(new_argv); exit(0); } if (pid == 0 ) { if(execv("/usr/local/AAA/rotD", new_argv) == -1) { fprintf(stderr, "프로그램 실행 error: %s\n", strerror(errno)); return 1; } free (new_argv); exit(0); } else { waitpid(pid, &p_stat, 0); free(new_argv); if (WIFEXITED(p_stat)) { if (WEXITSTATUS(p_stat)==0) { printf("success.\n"); return 1; } else { errno = WEXITSTATUS(p_stat); printf("fail!!~!!!!!!!!!\n"); return 0; } } } while(1) { sleep (5); } return 0; }
Forums:
댓글 달기