0

要件に応じて、すべてのヘッダーが含まれています。以下のこのコードは機能していますが、問題はにありshmat(seg_id,NULL,0)ます。NULL2番目の引数は、オペレーティングシステムがユーザーに代わって場所を処理することを意味します。しかし、私たちは自分の記憶の場所を与えることができますが、どのように?わからない、助けてください。(OS - Ubuntu 11.04 ,Compiler gcc 4.5.2) 試してみman shmatましたが、完全には理解できませんでした

typedef struct {
         int id;
} emp;

int main() {
         emp *e;
         int seg_id;
         const int size=sizeof(emp);
         seg_id=shmget( IPC_PRIVATE, size, S_IRUSR | S_IWUSR); 
         pid_t pid=fork();
         if(pid<0) {
                 printf("Error");
                 return -1;
         }
         else if(pid == 0) {
                e=(emp *)shmat(seg_id,NULL,0);     
                 e->id=123;
                 shmdt(e);                       
         }
         else {
                 wait(NULL);
                 e=(emp *)shmat(seg_id,NULL,0);  
                 printf("\nEmp Id : %d\n\n",e->id);
                 shmdt(e);                          
                 shmctl(seg_id, IPC_RMID, NULL);  
         }
         return 0;
}

shmget()4Kページアライメント用の独自のアドレスを取得するためにもこれを試しました

emp *e;
void **p;
posix_memalign(&p,4096,4096); // alignment as of pagesize 4K 
e=p; // get the first address of the aligned memory 
free(p); // free the allocated memory

次に、これをshmat(seg_id,e,0);//eが必要なアドレスになると考えて使用しました。しかし、それはセグメンテーション違反を与えています

または、3番目の引数にも問題がありますか?どんな助けや提案も大歓迎です

4

1 に答える 1

2

ここで何をしようとしているのかわかりませんposix_memalign()。その関数を呼び出してヒープからメモリ ブロックを割り当て、posix_memalign()共有メモリ セグメントをマップする場所として返された同じアドレスを使用しようとしています。そのアドレスはヒープの一部であるため、明らかに利用できません!

posix_memalign()を呼び出す前に によって返されたブロックを解放していることがわかりますshmat()が、ヒープからメモリのブロックを解放しても (一般に) ヒープは縮小しないため、アドレスは実際にはまだヒープの一部です。

に独自のアドレスを選択する必要がある場合shmat()は、ヒープやその他のマッピングとの競合を回避し、マッピングが大きくなるにつれてヒープがマッピングに対して実行されるのを避けるために、アドレス空間内の他のものから遠く離れたアドレスを選択する必要があります。プロセスの存続期間中。このようなアドレスの決定は、本質的に移植できません。

マッピングに固定アドレスを選択する唯一の理由は、複数の異なるプロセスで同じアドレスとしてマップされていることを確認することです (内部ポインターが機能するようにするため)。それが必要な場合は、OS に最初のプロセスで場所を選択させ、shmat()2 番目および他のすべてのプロセスで同じアドレスを呼び出すことができます。ただし、他のプロセスがたまたま同じアドレスに何かをマップしている可能性があるため、それでも機能しない場合があります。

于 2012-11-04T01:07:24.190 に答える