私のアプリでコマンドをバックグラウンドしようとすると問題が発生しましたので、私はtold hereを二重フォークしていくつかの設定をクリアするので、これは私の結果でした:C++ ServerSocket()、FD_CLOEXEC、fork()&execl()
if((pid = fork()) < 0)
perror("Error with Fork()");
else if(pid > 0) {
return "";
}
if (setsid()==-1) {
Log("failed to become a session leader");
}
if (chdir("/") == -1) {
Log("failed to change working directory");
}
umask(0);
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
if (open("/dev/null",O_RDONLY) == -1) {
Log("failed to reopen stdin");
}
if (open("/dev/null",O_WRONLY) == -1) {
Log("failed to reopen stdout");
}
if (open("/dev/null",O_RDWR) == -1) {
Log("failed to reopen stderr");
}
signal(SIGHUP, SIG_IGN);
Log("No return, forking..");
if((pid = fork()) < 0)
perror("Error with Fork()");
else if(pid > 0) {
return "";
} else {
if(execl("/bin/bash", "/bin/bash", "-c", cmddo, (char*) 0) < 0) perror("execl()");
exit(0);
}
ダブル「することができ、親が閉じているときにexecl'd procを停止する問題を修正しましたが、それは親ソケット上に保持execl'dプロセスで私を残し、その親はそれを再度起動しようとするとフォークt。私は私の最後の質問でソケットにFD_CLOEXECに言われた
ServerSocket server(listenport);
while(true)
{
ServerSocket* new_sock = new ServerSocket();
server.accept (*new_sock);
pthread_t thread;
int rc = pthread_create(&thread, NULL, &LoadThread, (void*)(new_sock));
if (rc) Log_warn("Fatal Error: pthread_create() #%d", rc);
pthread_detach(thread);
}
が、私はそれを行う方法を、理解していない - とGoogle(プラススタックが)ではありません。ここで
は私の親ソケットのものですそれについて私に多くの助けを示してくれました。
ServerSocket()でFD_CLOEXECを実行すると、サブプロセスをfork/execlするとソケットがハングアップしません。
ありがとう:D
ANSWER: からFD年代をクリアするには、以下の言われたよう - 私のコードは、実際にこれを持っていた、そしてそれは私の仕事:
struct rlimit rl;
int i;
if (rl.rlim_max == RLIM_INFINITY)
rl.rlim_max = 1024;
for (i = 0; (unsigned) i < rl.rlim_max; i++)
close(i);
を使用することが良いですか?私のアプリケーションの唯一のfdはデーモンに設定されているとき、私はすでにFD_CLOEXECです。 fd0 = open( "/ dev/null"、O_RDWR); \t fcntl(fd0、F_SETFD、FD_CLOEXEC);ありがとう! –
ServerSocketには内部的にfdがあります。これは実装の詳細であり、原則としてアプリケーションに関係しないはずですが、通常は抽象化を解除する方法があります(あるいは、ServerSocketにclose-on-execフラグを設定するよう教えることができますか?そうするべき正しいこと)。 –
'exec()'の標準ファイル記述子を閉じるべきではないことに注意してください。これらは子によって継承されるものです。そうでなければ、最初にそれらを設定するのは意味がありません。 –