共有メモリに配列があります。この配列を反復処理するためにポインターを使用したいのですが、これも共有することを意図しています。これが私が試したものです:
/* initialize color sequence in shared memory */
shmkey = ftok("/dev/null",3); /* executable name and a random number */
shmid = shmget(shmkey, sizeof(char), 0700 | IPC_CREAT);
if(shmid < 0){ /* shared memory error check */
perror("shmget\n");
exit(1);
}
queue = (char*) shmat(shmid, NULL, 0); /* shared memory part of colorSequence */
printf("queue allocated.\n");
/* initialize color sequence pointer in shared memory */
shmkey = ftok("/dev/null//",61); /* executable name and a random number */
shmid = shmget(shmkey, sizeof(char), 0700 | IPC_CREAT);
if(shmid < 0){ /* shared memory error check */
perror("shmget\n");
exit(1);
}
p = (char*) shmat(shmid, NULL, 0); /* pointer to queue in shared memory */
printf("queue pointer allocated.\n");
p = &queue[0];
ここで、子を fork して値 p を変更しようとしましたが、1 つのプロセスで行われた変更は他のプロセスには影響しません。
if(fork() == 0){ /* child process */
sem_wait(&sem);
printf(" Child printing *p=%c, p=%p\n",*p,p);
p++;
printf(" Child printing after++ p=%c, p=%p\n",*p,p);
sem_post(&sem);
exit(0);
}
else{ /* parent process */
sem_wait(&sem);
printf("Parent printing *p=%c, p=%p\n",*p,p);
p+=2;
printf("Parnet printing after++ p=%c, p=%p\n",*p,p);
p = NULL; //even though this, program doesn't fail
sem_post(&sem);
}
それでも、出力は次のとおりです (キューの内容は次のとおりです: RBG . . .):
Parent printing *p=R, p=0x7f5c77837000
Parnet printing after++ p=B, p=0x7f5c77837002
Child printing *p=R, p=0x7f5c77837000
Child printing after++ p=G, p=0x7f5c77837001
ポインターが共有されるはずなのに、なぜこれらの結果が得られるのかわかりませんでした。これを修正するのを手伝ってもらえますか? ありがとう。
編集
親プロセスで値 p が指す値を変更しようとすると、子プロセスから印刷するときに効果が表示されます。ただし、ポインタのインクリメントは機能しません。