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:


댓글 달기