0

TCP/IP でリクエストをリッスンし、そのリクエストを受信するとアプリケーションを起動する Linux デーモンを作成しています。私の問題は、このデーモンをコマンド プロンプトまたは IDE (Eclipse 3.7) から実行すると、すべて正常に動作し、実行可能ファイルが起動することです。しかし、私が使用する
sudo service <myservicename> start と、ソケットでリクエストを受け取りますが、その実行可能ファイルは起動しません。

これは、プロセスをデーモン化するために使用している標準コードです/// 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);

これは、起動する必要があるバイナリを起動する機能です。この関数は、フォークされた子プロセスで呼び出されます。

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");
}
4

1 に答える 1

0

したがって、Casey との話し合いの後、呼び出されたプログラムをさらに調査したところ、私のプログラムが実際に呼び出されていることがわかりました。また、環境変数は、子プロセスが親自体から環境を取得する問題ではないことがわかりました。メインプログラムで QApplication (qt gui アプリケーション) を作成しています。それとLinuxシステムデーモンに問題があります。私はそれを理解しようとし、必要に応じて別の質問をします.

編集: 最終的な解決策 XServer に接続できなかったのは qt GUI アプリケーションでした。Casey によって提案され、この投稿で与えられた変更が必要 でしたCannot connect to X server :0.0 with a Qt application

その後、起動を開始しました。

于 2013-06-07T20:11:57.340 に答える