2

私は無知であることを前もってお詫びします、これは私に本来よりも多くの問題を与えています、しかし私は私が間違っていることを考え出すために何時間も私の机に頭をぶつけてきました。構造体を格納する共有メモリを備えたアプリケーションを作成したい。何らかの理由で、開始するために地面から降りることができず、構造のメンバーにアクセスすることでセグメンテーションフォールトが発生し続けます。

#include <stdio.h>
#include <sys/shm.h>
#include <sys/stat.h>

#define MAX_SEQUENCE 10

struct shared_data
{
    long sequence[10];
    int sequence_size;
};
typedef struct shared_data shared_data;

int main(int argc, char * argv[])
{ 
    int segment_id;

    shared_data * shared_memory;

    segment_id = shmget(IPC_PRIVATE, sizeof(shared_data), S_IRUSR | S_IWUSR);

    shared_memory = (shared_data *) shmat(segment_id, NULL, 0);

    shared_memory->sequence_size = atoi(argv[1]);

    printf("\n\nSequence Size: %d\n\n",shared_memory->sequence_size);

    shmdt(shared_memory);
}

更新:皆さん、ありがとうございます。私のシステム管理者は診断を実行していて、どういうわけか共有メモリを無効にしました。

4

1 に答える 1

3

あなたのコードは私には悪く見えません。欠落している唯一の明らかなことは、次のように渡された引数の数のある種のチェックです。

if (argc != 2)
  return 1;

引数を使ってプログラムを呼び出すのを逃した可能性はありますか?この場合、

atoi (argv[1]) 

それはあなたのセグメンテーション違反につながります。

ところで:さらにの戻り値をチェックするshmgetことshmatも良い考えかもしれません。

于 2013-03-24T22:26:12.623 に答える