0

ユーザーのブラウザーとハードウェア デバイス間のトラフィックを管理する、c++ で記述されたサーバー プログラムがあります。このサーバーは私の centos マシンで実行されます。プログラムを正常に実行すると、問題なく実行されます。

しかし、プログラムをデーモンとして実行しようとすると、いくつかの問題が発生します。これはデーモンの私のコードです:

pid_t pid, sid;

pid = fork();
if(pid < 0){
    exit(EXIT_FAILURE);
}

if(pid > 0) {
    exit(EXIT_SUCCESS);
}

umask(0);

sid = setsid();
if(sid < 0){
    exit(EXIT_FAILURE);
}

if((chdir("/")) < 0){
    exit(EXIT_FAILURE);
}

close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);

while(1){
   //my program here
}

プログラムは正常に起動します。親は init です。何時間も実行できますが、約 10 ~ 15 の要求を行うと停止します。

プログラムをデーモンとして実行するためのコードは正しいと思います。私が心配しているのは、実際のコードです。従わなければならないルールはありますか?避けるべき悪い行動はありますか?コマンドライン出力(私が現在多く作成している)など、デーモンで許可されていないコマンドはありますか?

4

1 に答える 1

0

単純に閉じるstdoutstderr、これらへのすべての書き込みが失敗します。あなたのプログラムはそのようなエラーに遭遇し、それを検出して終了すると思います。標準的なテクニックは/dev/nulldup2(2)それをSTDOUT_FILENO、 、STDERR_FILENOに開くことSTDIN_FILENOです。

于 2014-03-06T13:22:30.753 に答える