0

私は現在、親プロセスから指定された数の子プロセスを作成する単純な C プログラムを作成しています。実際に正常に開始された子プロセスの数を追跡しようとしています。 -プロセスは成功しました。

ただし、 #!%€ 変数の愚かな部分では、それを変更できません.. 私は C を初めて使用し (したがって、プログラムの単純さと使いやすさに疑問があります)、別の変数を理解するのに少し問題があります。変数スコープと、いつ、どのように変更して、新しい値が固定されるようにするか...

それで、私の質問は次のとおりです。変数「アクティブ」を 1 増やすにはどうすればよいですか?

newChild() 関数が必要に応じて 1 を返し、その if ステートメント内の他のコードが機能することを既に確認しているので、そうではありません。また、ポインターを使用してみましたが、成功しませんでした... :(

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

main()
{
    printf("Parent CREATED\nRunning code...\n");

    // INITIATE Variables
    int children = 5;
    int active = 0;
    int parentID = getpid();

    // INITIATE Random Seed
    srand(time(NULL));

    // CREATE Children
    int i, cpid, sleepTime;

    for (i = 0; i < children; i++)
    {
        // Only let the parent process create new children
        if (getpid() == parentID)
        {
            // GET Random Number
            sleepTime = rand() % 10;

            // CREATE Child
            if (newChild(sleepTime) == 1)
            {
                // Mark as an active child process
                active++;
            }
        }
    }

    // CLEAN UP
    if (getpid() == parentID)
    {
        // Let the parent process sleep for a while...
        printf("Parent is now SLEEPING for 20 seconds...\n");
        sleep(20);
        printf("Parent is now AWAKE\nActive children: %d\n", active);

        // WAIT for Children
        int cpid, i;
        int status = 0;

        for (i = 0; i < active; i++)
        {
            // WAIT for Child
            cpid = wait(&status);

            // OUTPUT Status
            printf("WAITED for Child\nID: %d, Exit Status: %d\n", cpid, status);
        }

        printf("All children are accounted for.\nEXITING program...\n");
    }
}

int newChild(int sleepTime)
{
    // INITIATE Variable
    int successful = 0;

    // CREATE Child Process
    int pid = fork();

    if (pid == -1)
    {
        // OUTPUT Error Message
        printf("The child process could not be initiated.");
    }
    else if (pid == 0)
    {
        // Mark child process as successfully initiated
        successful = 1;

        // OUTPUT Child Information
        printf("Child CREATED\nID: %d, Parent ID: %d, Group: %d\n", getpid(), getppid(), getpgrp());

        // Let the child process sleep for a while...
        printf("Child %d is now SLEEPING for %d seconds...\n", getpid(), sleepTime);
        sleep(sleepTime);
        printf("Child %d is now AWAKE\n", getpid());
    }

    return successful;
}
4

1 に答える 1

1

fork()を呼び出すと、コードが誤って2つに凝縮される3つの結果があります。

  1. 戻り値-1は、フォークが失敗したことを示します。これはまれなエラー状態です。
  2. 戻り値0は、フォークが成功し、子プロセスにいることを示します。
  3. > 0の戻り値は、フォークが成功し、親プロセスにいることを示します。

ケース2と3の両方が「成功」していることに注目してください。ただし、newChild()関数は、ケース2の場合は1を返し、ケース3の場合は0を返します。代わりに、ケース3の場合は1を返し、ケース2の場合は.を返しません。ケース2の場合は、子プロセスに参加しているため、子プロセスを実行してから終了し、発信者に戻らないようにする必要があります。

if (pid == -1)
{
    // OUTPUT Error Message
    printf("The child process could not be initiated.");
}
else if (pid == 0)
{
    // OUTPUT Child Information
    printf("Child CREATED\nID: %d, Parent ID: %d, Group: %d\n", getpid(), getppid(), getpgrp());

    // Let the child process sleep for a while...
    printf("Child %d is now SLEEPING for %d seconds...\n", getpid(), sleepTime);
    sleep(sleepTime);
    printf("Child %d is now AWAKE\n", getpid());

    // This is the child process, so we should NOT EVEN RETURN from newChild().
    exit(0);
}
else
{
    successful = 1;
}

ここで重要なのは、fork()を呼び出すと、プロセスが2つの別々のプロセスに分割され、両方ともfork()が戻った時点から実行を継続することです。それらの違いは、一方が0の戻り値を取得し、もう一方が>0の戻り値を取得することです。前者は子で、後者は親です。

fork()の後、同じコードの2つのコピーが実行され、newChild()の2つの別々の呼び出しが実行され、active変数の2つの別々のコピーが実行されます。フォークした後、すべてのうちの2つがあります。

于 2013-03-13T21:46:32.857 に答える