7

また、それらのいずれかが発生しており、fork() または system() によって返されるエラーにつながるかどうかをどのように確認できますか? 言い換えれば、fork() または system() がエラーを返した場合、その特定のエラーが発生している理由を診断するために Linux でチェックできることは何ですか?

例えば:

  • 単純にメモリ不足です (結果は errno ENOMEM になります) - 「free」などでメモリの使用状況を確認してください。
  • カーネルが親プロセスのページ テーブルやその他のアカウンティング情報をコピーするのに十分なメモリがありません (errno EAGAIN になります)
  • グローバルなプロセス制限はありますか? (errno EAGAIN も発生しますか?)
  • ユーザーごとのプロセス制限はありますか? どうすればそれが何であるかを知ることができますか?
  • ...?
4

2 に答える 2

7

そして、それらのいずれかが発生しているかどうかをどのように確認できますか?

結果 (戻り値) が -1 の場合は、 errno値を確認します。

Linux の man ページから:

戻り
値 成功すると、子プロセスの PID が親に返され、0 が子に返されます。失敗すると、親に -1 が返され、子プロセスは作成されず、errno が適切に設定されます。

エラー
EAGAIN
fork() は、親のページ テーブルをコピーし、子にタスク構造を割り当てるのに十分なメモリを割り当てることができません。
EAGAIN
呼び出し元の RLIMIT_NPROC リソース制限に達したため、新しいプロセスを作成できませんでした。この制限を超えるには、プロセスに CAP_SYS_ADMIN または CAP_SYS_RESOURCE 機能が必要です。
ENOMEM
fork() は、メモリが不足しているため、必要なカーネル構造を割り当てることができませんでした。

SVr4、4.3BSD、POSIX.1-2001 に準拠。

于 2009-05-12T16:46:06.707 に答える
1

/etc/security/limits.conf の nproc は、ユーザーごとのプロセス数を制限できます。

fork からの return を調べることで、失敗を確認できます。0 はあなたが子にいることを意味し、正の数は子の pid であり、あなたが親にいることを意味し、負の数は fork が失敗したことを意味します。fork が失敗すると、外部変数 errno が設定されます。errno.h の関数を使用して調べることができます。通常、perror を使用して、エラーを (先頭にテキストを追加して) stderr に出力します。

#include <stdio.h>
#include <errno.h>
#include <unistd.h>

int main(int argc, char** argv) {
    pid_t pid;

    pid = fork();
    if (pid == -1) {
        perror("Could not fork: ");
        return 1;
    } else if (pid == 0) {
        printf("in child\n");
        return 0;
    };

    printf("in parent, child is %d\n", pid);

    return 0;
}
于 2009-05-12T16:54:27.487 に答える