0

10 個の子プロセスを実行する私のプロジェクトにはメモリ リークがあり、時々メモリ不足になります。

親プロセスは、シグナル 11 などのオペレーティング システム シグナルで終了した場合、子プロセスを再生成します。また、シグナル 9 の場合は再生成しません。プロセスを終了するためにシグナル 9 が本当に必要な場合があるためです (killall -9 myproduct のプロンプトなど)。.

子供が極端なメモリオペレーティングシステム(私の場合はFreeBSD 8.3)を使用すると、問題が始まります。子供に信号9を送信します。しかし、シグナル9であっても、ユーザーによってトリガーされないため、デッドプロセスをリスポーンしたいと思います。

メモリの問題が原因で発生したシグナル9とユーザーによってトリガーされたシグナル9をどのように分離できるか考えていますか。また、アドバイスできる C のチュートリアルやサンプル コードはありますか?

4

2 に答える 2

1

まず、メモリ リークを修正する必要があります。他に回避策はありません。

シグナルのソースを特定するには:

を参照してくださいsigaction(2)。へのsiginfo_t引数sa_sigactionstruct、次の要素を持つ です。

       siginfo_t {
           int      si_signo;    /* Signal number */
           int      si_errno;    /* An errno value */
           int      si_code;     /* Signal code */
           int      si_trapno;   /* Trap number that caused
                                    hardware-generated signal
                                    (unused on most architectures) */
           pid_t    si_pid;      /* Sending process ID */
           uid_t    si_uid;      /* Real user ID of sending process */
           int      si_status;   /* Exit value or signal */
           clock_t  si_utime;    /* User time consumed */
           clock_t  si_stime;    /* System time consumed */
           sigval_t si_value;    /* Signal value */
           int      si_int;      /* POSIX.1b signal */
           void    *si_ptr;      /* POSIX.1b signal */
           int      si_overrun;  /* Timer overrun count; POSIX.1b timers */
           int      si_timerid;  /* Timer ID; POSIX.1b timers */
           void    *si_addr;     /* Memory location which caused fault */
           long     si_band;     /* Band event (was int in
                                    glibc 2.3.2 and earlier) */
           int      si_fd;       /* File descriptor */
           short    si_addr_lsb; /* Least significant bit of address
                                    (since kernel 2.6.32) */
       }

ソースは次のように識別できます。

static void signal_handler(int sig, siginfo_t *siginfo, void *context)
{
    printf ("Sending PID: %ld, UID: %ld\n", (long)siginfo->si_pid,(long)siginfo->si_uid);
}

ただし、傍受SIGKILLSIGSTOPて処理することはできません。

于 2013-09-12T08:36:49.767 に答える
1

できません。そして、あなたは本当に問題を解決する必要があります。ほとんどのコンピューターは、OOM キラーが起動してメモリを解放する前に、金切り声を上げて停止します。OOM killer に頼ってアプリケーションを今すぐ再起動すると、ユーザーは気に入らないでしょう。

では信号へ。手動でいつでも親を殺すことができますよね?そのため、子が殺されても親が殺されていない場合は、いつでも再起動できます。子供たちを完全に殺すことを妨げるものではありません。また、デフォルトでkillはシグナルSIGTERMを送信し、システムはエラー時にそれを送信しないため、アプリケーションを終了するためにそれを使用できます。

于 2013-09-12T08:15:29.643 に答える