0

この質問に反対票を投じないでください。過度に具体的ではないことは承知していますが、それはまさに私の問題です。コード内ですべてのコマンドが何をするかは知っていますが、そもそもそれらがそこにある理由がわからないだけです。私の質問は主に私自身のプログラムに関連しているため、これは答えを探すのが非常に困難です。まだ答えられない場合は申し訳ありませんが、今後の質問を改善するよう努めます:)。

プロセスの作成と削除を交互に行いながら、共有メモリ間で通信できるプログラムを作成する必要があります。与えられたコード、特に以下のビットを理解しようとしています。一番下に、誰かが私の質問に答えるのに役立つ場合に備えて、プロデューサー コード全体を含めました。

質問: *randNum が 101 を超えてインクリメントされるのはなぜですか? 出力を出力する条件は 101 に等しい場合です。

これは、条件が満たされるために、コンシューマーが場所 *randNum に含まれる値を変更する必要があることを示唆していますか?

for(A = 0; A < size; A++)    // for loop to reset all priority values so that they are clear to be used in the next set
    {
        *randNum = 101;
        *randNum++;
    }

後で if コマンド:

if(*randNum == 101)
                    {
                        *randNum = rand() % (100 - 1) + 1;
                        *pidNum = getpid();

                        printf("priority: %d Process ID: %d \n", *randNum, *pidNum);

                        x = 1;
                    }

約束どおり、完全なプログラムを以下に完成させます (説明を簡単にし、質問を防ぐため、コンテキストを提供するため)

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>


void shm2sz(int size);

int main(int argc, char *argv[])


{
    int shmid, A, B, count, *shm, *randNum, *pidNum, pid, *memSig;

    key_t key;

    int size = atoi(argv[1]);

    int shmsz = (size * 2) + 1;  // declaring size of shared mem to be twice the size of user input, + 1 for owner ID

    int x = 0;

    int noToCreate = atoi(argv[2]);

    shm2sz(shmsz);
    key = 2060;        // Identifier key for SharedMem

    shmid = shmget(key, shmsz, IPC_CREAT | 0666);  //creating Sharedmem

    if(shmid < 0)   // variable if sharedmem is less than 0, print error.

            {
                    perror("shmget");    // eror mesage print
                    exit(1);
            }

    shm = shmat(shmid, NULL, 0);    //Attach to shared mem, if fails.. proceed with error message

    if(shm == (int *) -1)   // eror message

        {
                perror("shmat");
                exit(1);
        }


    randNum = shm;         // declare randNum equal to shm

    pidNum = shm + size;   // set pid to the first bit of the second part of the shared mem

    memSig = shm + shmsz;  // set memsig as final value in shared mem

    *memSig = 0;

    for(A = 0; A < size; A++)    // for loop to reset all priority values so that they are clear to be used in the next set
    {
        *randNum = 101;
        *randNum++;
    }

    count = 0;      // set count back to 0

    randNum = shm;              //check randNum equal to shm
    pidNum = shm + size;

    while(*memSig != 2)
    {
        while(*memSig == 1)   // set memsignature to sleep while..
        {
            sleep(1);
        }

        for(B = 0; B < noToCreate; B++)     
        {
            pid = fork();

            if(pid == -1)
            {
                perror("Error forking");
                exit(1);
            }
            else if(pid > 0)
            {
                wait(0);
            }
            else
            {
                srand(getpid());

                while(x == 0)
                {
                    if(*randNum == 101)
                    {
                        *randNum = rand() % (100 - 1) + 1;
                        *pidNum = getpid();

                        printf("priority: %d Process ID: %d \n", *randNum, *pidNum);

                        x = 1;
                    }
                    else
                    {
                        *randNum++;
                        *pidNum++;
                    }
                }
                exit(0);
            }
        } /* Closes main for loop */

        if(*memSig == 0)
        {
            *memSig = 1;
        }
    } /* Closes main while loop */
}

void shm2sz(int size)
{
    int shmid, *shm2;
    key_t key;

    key = 9876;

    shmid = shmget(key, 2, IPC_CREAT | 0666);

    if(shmid < 0)
    {
        perror("shmget2");
        exit(1);
    }

    shm2 = shmat(shmid, NULL, 0);

    if(shm2 == (int *) -1)
    {
        perror("shmat2");
        exit(1);
    }

    *shm2 = size;
}
4

1 に答える 1

1

後置インクリメント演算子の演算子の優先順位は、ポインター逆参照演算子よりも高くなります。これは、*randNum++実際にポインタ randNumが増加することを意味します。

が指す値を増やしたい場合は、randNum括弧を使用する必要があります。

(*randNum)++;
于 2013-07-29T12:55:06.800 に答える