0

我正在尝试将带有数据的文件写入我的共享内存段。然而,我所尝试的一切似乎只是给出了错误分割错误。我一直在互联网上寻找帮助超过一天。

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. 字符 (*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 回答