0

データを含むファイルを共有メモリ セグメントに書き込もうとしています。ただし、私が試したことはすべて、セグメンテーション違反というエラーが発生するようです。私はインターネットで助けを求めて1日以上検索しています。

int main(int argc, char *argv[]).
{
    int sm;
    char *data;
    int pid=atoi(argv[1]);
    int key=atoi(argv[2]);
    char (*d)[1025];
    data=(char*) malloc(1025);


    //put the data in the shared memory segment
    FILE *file=fopen(argv[3], "r"); //r for read
    if (file==0)
    {printf("Could not open file");}
    else
    {
        while(fgets(data, 1025, file)!=NULL)
        {
            fputs(data, file);
        //  puts(d);
        }       
        fclose(file);
    }

    //access shared memory 
    //S_IWUSR gives owner the write permession
    sm = shmget(key, 1024, S_IWUSR); 
    //create a pointer to the shared memory segment
    d =  shmat(sm, (void *)0, 0); //shared memory id, shmaddr, shmflg
    //for (int j=0; j<100; j++)
        strcpy(d[0], data);

    shmdt(d); //detach the shared memory segment
    //remove the shared memory segment
    shmctl(sm, IPC_RMID, NULL);
}

どんな助けでも大歓迎です 事前に感謝します

編集:mallocを追加

EDIT2:質問を言い換える必要があるかもしれません。私の問題は、共有メモリにデータを取得することです

4

2 に答える 2

0
  1. ファイルは読み取りモードでのみ開かれます。

rw+ファイルを読み取り/書き込みモードで開くように変更します。ファイルが利用できない場合は、作成されます。

fputs(data, file);ここでファイルは読み取り専用モードで開かれていますが、書き込みが行われています。

しかし、なぜ読み取りデータを同じファイルに書き込もうとしているのかわからない。最初に設計を検討する必要があります。

2. char (*d)[1025]; サイズ 1025 の char 配列へのポインタです。strcpy() で使用しています。

3.data静的または動的にメモリを割り当てる必要があります。

于 2012-12-17T11:22:26.937 に答える
0

+1 rjayavrp の回答について

そして、データが割り当てられていないことを追加できます...これは単なるポインターであり、文字の配列ではありません..

さらに、あなたは何をしようとしていますか

char (*d)[1025];

簡単で汚い例:

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define SIZE_SHARED_MEMORY  1024

int main(int argc, char *argv[])
{
    int sm = -1;
    char *d = NULL;
    FILE *file = NULL;
    key_t key = 0;
    int ret = 0;

    if (argc != 4)
    {
        return 1;
    }

    key = atoi(argv[2]);

    //access shared memory
    sm = shmget(key, SIZE_SHARED_MEMORY, IPC_CREAT | 0600);
    if (sm == -1)
    {
        perror("shmget : Failed");
        return 2;
    }

    //create a pointer to the shared memory segment
    d =  shmat(sm, (char *)0, 0);
    if (d == (void *)-1)
    {
        perror("shmat : Failed");
        return 3;
    }

    // Open the file
    file = fopen(argv[3], "r");
    if (file == NULL)
    {
        perror("fopen : Failed");
        ret  = 4;
    }
    else
    {
        if(fgets(d, SIZE_SHARED_MEMORY, file) == NULL)
        {
            perror("fgets : Failed");
            ret = 5;
        }
        fclose(file);
    }

    shmdt(d); //detach the shared memory segment

    // remove the shared memory segment ???
    // Don't understand why you are doing this
    shmctl(sm, IPC_RMID, NULL);

   return ret;
}
于 2012-12-17T11:29:50.287 に答える