2016-05-07 24 views
0

shmat割り振りエラーが発生しました。私はメモリが不足していると言っていましたが、以前は私には起こりませんでした。 これはエラーです:shmatを実行しようとしたときに割り当てエラーが発生しました

0xffffffffffffffff error: Cannot access memory at address 0xffffffffffffffff

とwiered事がvecBoardは、プロセスマッピングされた領域に割り当てられ、shmatがトリガされたときにのみ、狂気を取得していることです。皆さん、ありがとうございました!

#include <string.h> 
    #include <stdio.h> 
    #include <sys/types.h> 
    #include <unistd.h> 
    #include <stdlib.h> 
    #include <sys/fcntl.h> 
    #include <errno.h> 
    #include <fcntl.h> 
    #include <time.h> 
    #include <signal.h> 
    #include <sys/ipc.h> 
    #include <sys/shm.h> 
    #include <sys/sem.h> 

    #define SHM_SIZE 4096 
    #define FLAGS IPC_CREAT 
    #define COLUMNS 8 
    #define ROWS 8 
    key_t key;  

int main() 
{ 
    char* vecBoard; 

    // Creating shared memory : 

    if ((key = ftok("ex31.c",'k')) == -1) 
    { 
     perror("ftok"); 
     exit(1); 
    } 
    int shm_id; 
    shm_id=shmget(key,SHM_SIZE,FLAGS); 
    if(shm_id==-1) 
    { 
     printf("error creating shared memory\n"); 
     exit(0); 
    } 
    printf("the shared memory segment ID is: %d\n",shm_id); 

    vecBoard = (char *)shmat(shm_id,0,0); 
    if((vecBoard = (char *)shmat(shm_id,0,0)) == (char*)-1) 
    { 
     printf("error in attaching to the shared memory\n"); 
     exit(0); 
    } 
} 
+0

その混乱を整理してください:適切な書式と字下げ.C++ではなくCのように見えます.C++としてコンパイルすると、C++にタグをchengeします。 Cタグを削除してください。また、 'void *'をCのポインタにキャストしないでください。Cの_null-pointer constant_には 'NULL'マクロ、C++では' nullptr'を使います。 – Olaf

+1

表示されたコードは、割り当てられたメモリ( 'vecBoard')にアクセスしません。何がエラーメッセージを表示するのですか? – Tsyvarev

答えて

0

示されたコードは、同じメモリセグメントに対してshmat()を2回呼び出します。

明らかに間違っています。

+0

あなたの答えをありがとう、私は最初のshmat( "vecBoard =(char *)shmat(shm_id、0,0);")を削除し、問題は同じままです。 –

0

errnoを確認すると、問題の診断に役立ちます(つまり、printfの代わりにperrorに失敗した場合)。 OSはシステムコールが失敗したときに情報を提供します。それを無視しないでください!

shmgetのマニュアルページを慎重に読んでいる場合、3番目の引数(flags)は、共有メモリセグメントに必要な権限をその下位9ビットに含めることになっています。ここでIPC_CREATを渡すだけでは、これらのビットは0にクリアされるため、誰も読み取りまたは書き込みの権限を持たないセグメントを作成します。あなたは(暗黙的に)読んで、そのセグメントの書き込みの両方に求めている、とあなたがいずれかを実行する権限を持っていないので、このようshmatEACCESと(失敗。

したい場合は、おそらく、IPC_CREAT | 0600のようなものに変更したいですセグメントにアクセスできるようにするために、現在のユーザー。

再びこれをテストする前に、あなたはおそらく間違った権限で既存の共有メモリセグメントを削除する必要がありますので注意してください。このためipcsipcrmツールを使用してください。

関連する問題