-1

コード :

for ( ii = 0; ii < 24; ++ii) {

    switch (fork()) {

        case -1 : {
                printf("\n\nproblem with fork() !!! \n\n");
                exit(0);
                };

        case 0 : {
                WriteOnShared_Mem(ii);
                }break;
        default : {
                ChildPidTab[ii] = p;
                usleep(50000);
                ReadShared_MemMp(nbSect, 24,ChildPidTab);
                };
    }
}

私の問題は、あまりにも多くの子 (nbenfant = 24) を取得していることです。24 をはるかに超えています。

これは今日の私の3番目の投稿ですが、まだ解決されていません:(

ありがとう

4

3 に答える 3

1

これは、各子がループを続行し、自分の子を fork するためです。子が完了したら、メイン関数から戻るか、 を呼び出す必要がありますexit

于 2013-08-31T14:56:08.560 に答える
1

fork(2)のman ページをよく読んでください。そのページを何度も読んでください。理解するのは難しいです。フォーク (システム コール)プロセス (コンピューティング)のウィキページもお読みください。

理解してください-そしてそれには時間がかかります-成功すると2回同時にfork返されます:親で1回、子で1回

forksyscall は、さまざまな理由で失敗する (そして -1 を返す) 場合があります。失敗した場合は、forkを使用するperrorか、他の方法で表示してerrnoください。そして、常に の結果を保持する必要がありforkます。だからコード

for (ii = 0; ii < 24; ++ii) {
 fflush(NULL);
 pid_t p = fork();
 switch (p) {
    case -1 : // fork failed 
            printf("\n\nproblem with fork() in pid %d error %s!!! \n\n",
                   (int) getpid(), strerror(errno));
            exit(EXIT_FAILURE);
            break;
    case 0: // child process
            WriteOnShared_Mem(ii);
            ii = MAX_INT; // to stop the for loop
            break;
    default: // parent process
            ChildPidTab[ii] = p;
            /// etc.... some synchronization is needed
            break;
    }

特に、次のfork理由で失敗する可能性があります。

   EAGAIN fork() cannot allocate sufficient memory to copy the
          parent's page tables and allocate a task structure for 
          the child.
   EAGAIN It was not possible to create a new process because the
          caller's RLIMIT_NPROC resource limit was encountered.  To
          exceed this limit, the process must have either the
          CAP_SYS_ADMIN or the CAP_SYS_RESOURCE capability.
   ENOMEM fork() failed to allocate the necessary kernel structures
          because memory is tight.

より多くのプロセスをフォークできるようにしたい場合は、次のことを試してください。

  • setrlimit(2)RLIMIT_NPROCを使用してリソース制限を増やします (システム機能によって呼び出される可能性があるため、その他も調べます) 。/etc/pam.d/login

  • fork-ing プログラムが必要とするリソースを減らします。特に、ヒープメモリ要件を下げます

  • おそらくスワップなど、いくつかのシステムリソースを増やします。swaponテスト用の一時ファイルを作成できます。

Joachim Pileborg が答えたように、フォークしすぎないようにする必要があります (フォークされたプロセスはループを継続するため、再びフォークします)。

stdioルーチンがバッファリングされることを忘れないでください。fflush(3)を適切に使用してください。

Linux でのプロセス処理を説明する完全な章があるAdvanced Linux Programming book (オンラインで入手可能) を読むことをお勧めします。

ところで、あなたが持っているプロセスの数を確認してください(そして、コマンドでどれだけのメモリが使用されているかを確認してください。ただし、文句を言う前にhttp://linuxatemyram.com/を読んpsでください特定のシステムが特定のプログラムを 24 回以上 fork できない場合があります (リソース不足のため)。toppstreefree

sash単純なシェル ( など)のソース コードも調べてstrace -f(たとえば、シェルやプログラムで) 使用して、syscall が実行される内容をより理解してください。gdbまた、デバッガーの使用方法も学びます。

于 2013-08-31T14:57:22.527 に答える
1

子プロセスは、新しい子プロセスをフォークします。停止する必要があります。

このような:

 switch (fork()) {

    case -1 : {
            printf("\n\nproblem with fork() !!! \n\n");
            exit(0);
            };

    case 0 : {
             i = 24 ;                 //--- here I set i = 24 , so child process will stop fork new child process.
            WriteOnShared_Mem(ii);
            }break;
    default : {
            ChildPidTab[ii] = p;
            usleep(50000);
            ReadShared_MemMp(nbSect, 24,ChildPidTab);
            };
    }
}
于 2013-08-31T15:27:41.443 に答える