子プロセスから共有メモリのアタッチ
Posted: 2011年4月03日(日) 15:53
お世話になります。
現在、Cygwin にて共有メモリについて学習しています。そこで質問なのですが、
親プロセスで新規作成した共有メモリに、子プロセスでアタッチし、値を設定、デタッチしようとしているのですが、
子プロセスでアタッチをすると異常終了してしまいます。
子プロセスからアタッチはできると思っているのですが、どこがいけないのでしょうか。
どうか、よろしくお願いします。
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <string.h>
int main(void)
{
int id;
int i;
/* 共有メモリ新規作成 */
id = shmget(IPC_PRIVATE, 512, 0666);
if(id == -1) {
perror("main-shmget ");
exit(-1);
}
/* 子プロセスを生成 */
if (fork() == 0) {
char *adr;
printf("子プロセス開始\n");
/* プロセスアドレス空間にアタッチ */
adr = (char *)shmat(id, NULL, 0); // ★ ココでアタッチエラー
if(adr == (void *)-1) {
perror("子プロセス - shmat ");
exit(-1);
}
/* 共有メモリ・セグメントに文字列をコピー */
strcpy(adr, "Hello\n");
/* プロセスアドレス空間をデタッチ */
if(shmdt(adr) == -1) {
perror("子プロセス - shmdt ");
exit(-1);
}
printf("子プロセス終了\n");
exit(0);
}
/* 親プロセス-子の終了を待つ */
wait(NULL);
/* 共有メモリを破棄 */
if (shmctl(id, IPC_RMID, NULL) == -1){
perror("main-shmctl ");
exit(-1);
}
printf("親プロセス終了\n");
return 0;
}
現在、Cygwin にて共有メモリについて学習しています。そこで質問なのですが、
親プロセスで新規作成した共有メモリに、子プロセスでアタッチし、値を設定、デタッチしようとしているのですが、
子プロセスでアタッチをすると異常終了してしまいます。
子プロセスからアタッチはできると思っているのですが、どこがいけないのでしょうか。
どうか、よろしくお願いします。
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <string.h>
int main(void)
{
int id;
int i;
/* 共有メモリ新規作成 */
id = shmget(IPC_PRIVATE, 512, 0666);
if(id == -1) {
perror("main-shmget ");
exit(-1);
}
/* 子プロセスを生成 */
if (fork() == 0) {
char *adr;
printf("子プロセス開始\n");
/* プロセスアドレス空間にアタッチ */
adr = (char *)shmat(id, NULL, 0); // ★ ココでアタッチエラー
if(adr == (void *)-1) {
perror("子プロセス - shmat ");
exit(-1);
}
/* 共有メモリ・セグメントに文字列をコピー */
strcpy(adr, "Hello\n");
/* プロセスアドレス空間をデタッチ */
if(shmdt(adr) == -1) {
perror("子プロセス - shmdt ");
exit(-1);
}
printf("子プロセス終了\n");
exit(0);
}
/* 親プロセス-子の終了を待つ */
wait(NULL);
/* 共有メモリを破棄 */
if (shmctl(id, IPC_RMID, NULL) == -1){
perror("main-shmctl ");
exit(-1);
}
printf("親プロセス終了\n");
return 0;
}