2

タスクで 2 つのプロセスを同時に開始しようとしています (たとえば、数を数えます)。プロセスごとに 1 つずつ、2 つの準備完了フラグを設定し、while ループを実行して、両方のフラグが立っているかどうかを確認します。次に、チェックに合格した後、2 つのプロセスがカウントを開始します。理由がわからない、機能しないコードは次のとおりです。

int p1ready=0;
int p2ready=0;
int onebil = 1000000000;

int main(){

int pid;
int exit_code;

pid=fork();
if(pid==0){
//child1
    int count1=0;
    p1ready=1;    //signal
    while(!(p1ready&p2ready))'//wait until 2 processes are both ready

    while(count1!=onebil){
        count1++;
    }
    exit(0);
}
else{
    pid=fork();
    if(pid==0){
    //child2
        int count2=0;
        p2ready=1;    //signal
        while(!(p1ready&p2ready));//wait until 2 processes are both ready
        while(count2!=onebil){
            count2++;
            }
        exit(0);
    }
    else{
    //parent
       //do stuff
    }
return 0;
}

このコードの問題は、child1 と child2 で、自分の準備完了フラグだけが 1 に設定されていることです。他の子のフラグが設定されているのを確認できません。たとえば、child1 には p1ready=1 しか表示されませんが、p2ready は常に 0 です。なぜそうなるのでしょうか? どうすればこれを修正できますか?

前もって感謝します!

4

2 に答える 2

4

fork() を実行すると、各プロセスはプライベートな新しいアドレス空間を取得します。親と子はデータを共有しません。ここで、プロセス間通信メカニズムが登場します。

セマフォを使用する場合があります。このリンクを参照してください:

プロセスに相当するセマフォ? .

http://www.csc.villanova.edu/~mdamian/threads/posixsem.html

親でセマフォを準備し、フォークごとに各子を待機させ、親で解放することができます。両方の子プロセスが解放され、同時に実行が継続されます。もちろん、どれが最初に実行されるかは、OS 実行スケジューラに依存します。

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

    int p1ready=0;
    int p2ready=0;
    int onebil = 1000000000;

    int main(){

    int pid;
    int exit_code;

    // create a semaphore for each child: value=0
    sem_t *sem1 = sem_open("test_semaphore", O_CREAT|O_EXCL);
    sem_t *sem2 = sem_open("test_semaphore", O_CREAT|O_EXCL);

    pid=fork();
    if(pid==0){
        //child1
        // wait on semaphore => blocks if value <= 0
        sem_wait(sem1);
        int count1=0;
        // do work => a function might be better
        while(count1!=onebil){
            count1++;
        }
        exit(0);
    }
    else{
        pid=fork();
        if(pid==0){
            //child2
            // wait on semaphore => blocks if value <= 0 
            sem_wait(sem2);
            // do work
            int count2=0;
            while(count2!=onebil){
                count2++;
                }
            exit(0);
        }
        else{
            //parent
            // signal semaphore1 (increment) releasing child 1
            sem_post(sem1);
            // signal semaphore2 (increment) releasing child 2
            sem_post(sem2);

            // do work

            // wait for child1/child2
            int status;
            wait(&status); // a child has exited
            // do something with status
            wait(&status); // another child has exited
            // do something with status

        }
    return 0;
    }
于 2013-03-24T23:42:51.600 に答える
2

p1readyプロセスを同期しようとしている方法は、作成しているすべてのプロセスがとの独自のコピーを持つため、機能しませんp2ready

あなたが探しているように見えるのは、ある種のプロセス間通信です。http://en.wikipedia.org/wiki/Inter-process_communicationを見て、可能なオプションのリストを確認することをお勧めします。

質問で言及されているような単純なケースでは、おそらく両方の子プロセスに親プロセスからのシグナルを送信するだけで十分なので、それを確認することをお勧めします。

于 2013-03-24T23:36:57.850 に答える