4

私はCを初めて使用し、過去2週間、フォークについて調査してきました。オペレーティングシステムクラスでこの問題を解決する必要があります。

「フォークを使用して「重い」プロセスを作成する必要があります。次に、最初のプロセスは2番目(新しいプロセス)が親IDを返すのを待ってから、親を強制終了して終了する必要があります。」

手順はかなり紛らわしいと思います。これはこれまでの私のコードです(私が言ったように、私はCに慣れていないので、調査しているところです)私の問題は、親が子プロセスを待っていないことです。その後、子が親を殺しているので、そのIDを返します。これで、子プロセスを作成していると思います。実行すると、親が子の実行を待たずに、最後に親を殺します。(それは私が命令について混乱していると思う部分です)私はコーディングの際により確実に感じることができるように、それらの背後にあるロジックのようなフォークとプロセスについてもっと知りたいです。ありがとう!

#include <sys/types.h>
#include <wait.h>
#include <unistd.h>
#include <stdio.h>


int main() {
    pid_t idProceso;
    int childState;

    idProceso = fork();

    if (idProceso == 0){
        printf ("child id  :  %d. parent id %d\n", 
        getpid(), getppid());

            int parent = getppid();
            kill(parent, SIGKILL);
            printf ("dead parent"); //  not sure about it  ??
            _exit();
    }

    if(idProceso > 0){
        sleep (1);
        printf ("parent id :  %d. child id %d\n", 
        getpid(), idProceso);

        wait (&childState);

    }

    return 0;
}
4

3 に答える 3

1
$ ./foo.bin
parent id :  6629. child id 6630
child id  :  6630. parent id 6629
dead parentKilled

を削除したところsleep(1)、出力は妥当なようです。

于 2013-03-09T18:54:26.683 に答える
1

私の問題は、親が子プロセスがIDを返すのを待っていないことです。

プログラムのどこにも、子がその ID を親に返すことはありません。発生している唯一の通信は、SIGKILL シグナルを親に送信する子です。

だから私は子プロセスを作成していると思います。それが実行されると、最後に親を殺し、親が子の実行を待たないようにします。

はい、あなたは正しいです。子は kill() 関数を使用して SIGKILL シグナルを送信することにより親プロセスを強制終了しますが、親は実際には子によって強制終了されるのを待ちます。

wait (&childState);

これにより、親は子が終了するのを待ちます(そこにハングアップします)。終了後、親は先に進みますが、プログラムでは、親が子が終了するのを待っている間、子自体がその間に親を終了します待つ。

フォークとプロセスについて、その背後にあるロジックなどについてもっと知りたいので、コーディングするときに自信を持てるようになります。

これは一見の価値があります。

于 2013-03-09T18:45:35.553 に答える
1

あなたが与えた課題の説明に基づいて、それを割り当てた講師または教授は、英語または Unix マシンでのプロセスの概念のいずれかをよく理解していないと思います。

あなたが提示した解決策は合理的ですが、スリープの呼び出しを削除します。Childstate が正しく設定されることはありません。すべてが必要なわけではありません。さらに、SIGKILL を親に送信しないでください。SIGKILL は、プロセスを終了しようとする最後の方法です。SIGTERM を親プロセスに送信することをお勧めします。Linux マシンを使用している場合、親プロセスは sigaction を使用してシグナル ハンドラーをインストールできます。シグナル ハンドラーでは、「Received terminate signal from child」のような素敵なメッセージを出力して、exit を呼び出すことができます。これを行うと、教授はおそらくあなたのスキルに適切に感銘を受け、合格点を与えるでしょう.

それができない場合は、より良い問題をお願いします。実際に問題を解決する前に、文法や句読点の修正を教授に提出して承認を得る必要があることは珍しくありませんでした。

于 2013-03-09T18:42:22.517 に答える