exec函数不能从linux守护进程中运行

时间:2013-06-07 06:21:46

标签: c++ daemon shell-exec

我一直在编写一个linux守护进程,它侦听TCP / IP请求并在接收该请求时启动应用程序。我的问题是当我从命令提示符或IDE(eclipse 3.7)运行这个守护进程时,一切正常,我的可执行文件启动。但是当我使用
时     sudo service <myservicename> start 它将在socket上接收请求,但它不会启动该可执行文件。

这是我用于守护进程的标准代码     /// Linux守护进程相关的东西

/// Create the lock file as the current user 
int lfp = open( "/var/lock/subsys/LauncherService", O_RDWR|O_CREAT, 0640);
if ( lfp < 0 ) 
{
    LOG_ERROR ("Unable to open lockfile");
    LOG_ERROR ( strerror(errno) );
}

/// All
/// Our process ID and Session ID
pid_t pid, sid;

/// Fork off the parent process
pid = fork();
if (pid < 0) {
       exit(EXIT_FAILURE);
}

/// If we got a good PID, then
///  we can exit the parent process.
if (pid > 0)
{
    exit(EXIT_SUCCESS);
}

/// Change the file mode mask
umask(0);

/// Create a new SID for the child process
sid = setsid();
if (sid < 0)
{
    LOG_ERROR ("Error Setting sid");
    exit(EXIT_FAILURE);
}
LOG_INFO ("sid set");

/// Change the current working directory
if ( (chdir("/usr/local/<mylocaldir>/bin")) < 0 )
{
       LOG_ERROR ("Error changing Directory");
       exit(EXIT_FAILURE);
}
LOG_INFO ("chdir successful");

/* Close out the standard file descriptors */
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);

这是我正在启动需要启动的二进制文件的功能。在forked子进程中调用此函数。

std::string configFile = "/usr/local/<mydir>/config/Settings.config";
std::string binary = "<binaryname>";
std::string path ="/usr/local/<mydir>/bin/<binaryname>";

//char *argv[] = { "<binaryname>", "/usr/local/<mydir>/config/Settings.config", (char *)0 };

LOG_INFO("Calling Process" );
if ( execlp( path.c_str(), binary.c_str(), configFile.c_str(), (char *)0 ) == -1 )
//if ( execv("/usr/local/<mydir>/bin/<binaryname>", argv) == -1 )
//if ( execvp("/usr/local/<mydir>/bin/<binaryname>", argv) == -1 )
{
    LOG_ERROR("System call failed !!")
    std::string errString = strerror(errno);
    LOG_ERROR (errString );
}
else
{        
    LOG_INFO("System call successful");
}

1 个答案:

答案 0 :(得分:0)

所以在与Casey讨论之后,我对调用的程序进行了更多调查,发现我的程序确实被调用了。另外我发现环境变量不是子进程从父进程本身获取环境的问题。我正在我的主程序中创建QApplication(qt gui应用程序)。它和linux系统守护进程有些问题。我将尝试解决这个问题,并在需要时提出单独的问题。

编辑:最终解决方案 这是一个qt GUI应用程序,无法连接到XServer。我不得不改变凯西的建议并在这篇文章中给出 Cannot connect to X server :0.0 with a Qt application

之后开始启动。