【问题标题】:Shared memory program not synchronized - Giving segmentation faults共享内存程序不同步 - 给出分段错误
【发布时间】:2013-01-27 10:55:39
【问题描述】:

我正在尝试将共享内存与我在这里展示的 2 个程序一起使用。 a 和 b 是整数数组,array1 和 array2 是字符串数组。这是sn-p第一个将数据加载到内存中的程序

int size = (NUMBER_OF_DATA*(sizeof(int)+sizeof(float)));
key_t key1, key2, key3;
key1 = ftok("/home/an/Desktop/newww.c", 4);
key2 = ftok("/home/an/Desktop/part1.c", 5);
key3 = ftok("/home/an/Desktop/part2.c", 6);
int shmid = shmget(key1, size, 0777|IPC_CREAT);
int shmid1 = shmget(key2, 20*NUMBER_OF_DATA, 0777|IPC_CREAT);
int shmid2 = shmget(key3, 20*NUMBER_OF_DATA, 0777|IPC_CREAT);
int *a = (int *)shmat(shmid, 0, 0);
float *b = (float *)(a + NUMBER_OF_DATA);
char **array1 = (char **)shmat(shmid1, 0, 0);
printf("array1 %p\n", &array1);
char *mempos = (char *)(array1 + NUMBER_OF_DATA); 
printf("MEMPOS %p\n", &mempos);
char **array2 = (char **)shmat(shmid2, 0, 0);
char *mempos1 = (char *)(array2 + (NUMBER_OF_DATA)); 

for(i=0; i<NUMBER_OF_DATA; i++)
{
    a[i] = a[i];
    b[i] = b[i];
    array1[i] = mempos; 
    strcpy(array1[i], array1[i]);
    mempos += 20;
    array2[i] = mempos1;
    strcpy(array2[i], array2[i]);
    mempos1 += 20;
    printf("%p  %p  %p  %p\n", &a[i], &b[i], array1[i], array2[i]);
}

j = 0;
while (j<5)
{
    j++;
    for (i=0; i<NUMBER_OF_DATA; i++)
    {
        printf("%s  %s  %d  %f\n", array1[i], array2[i], a[i], b[i]);
    }
    printf("\n");
    sleep(2);
}

我正在尝试通过上述文件在共享内存中加载一些数据,并通过以下文件更改共享内存中的元素。但是,一旦我在下面的文件中更新了一个字符串,我就会从上面的程序中得到垃圾值,而不是改变的值。我完全糊涂了。已尝试使用 gdb 进行调试,但那里一切正常。

int size = (NUMBER_OF_DATA*(sizeof(int)+sizeof(float))) + (2*(20*NUMBER_OF_DATA));
key_t key1, key2, key3;
key1 = ftok("/home/an/Desktop/newww.c", 4);
key2 = ftok("/home/an/Desktop/part1.c", 5);
key3 = ftok("/home/an/Desktop/part2.c", 6);
int shmid = shmget(key1, size, 0777|IPC_CREAT);
int shmid1 = shmget(key2, 20*NUMBER_OF_DATA, 0777|IPC_CREAT);
int shmid2 = shmget(key3, 20*NUMBER_OF_DATA, 0777|IPC_CREAT);

int *a = (int *)shmat(shmid, 0, 0);
float *b = (float *)(a + NUMBER_OF_DATA);
char **array1 = (char **)shmat(shmid1, 0, 0);
printf("array1 %p\n", &array1);
char *mempos = (char *)(array1 + NUMBER_OF_DATA); 
printf("MEMPOS %p\n", &mempos);
char **array2 = (char **)shmat(shmid2, 0, 0);
char *mempos1 = (char *)(array2 + (NUMBER_OF_DATA)); 
int i;
for(i=0; i<5; i++)
{
    printf("enter\n");

    array1[i] = mempos; 
    scanf("%s", array1[i]);
    mempos += 20;
}

解决办法是什么?

【问题讨论】:

  • 你为什么不使用boot shared memory library
  • 我在你的代码中没有看到任何错误检查——你怎么知道你对shmgetshmat等的所有调用都是成功的?
  • @drone.ah:它被标记为 c,所以 boost 可能不是一种选择(否则我会同意你的看法 - boost::interprocess 是 C++ 的方式)
  • 对于新代码应该不需要使用复杂的shmget等调用。请改用现代 POSIX 接口 shmopenmmap

标签: c pointers segmentation-fault shared-memory


【解决方案1】:

问题很可能不是您认为的问题,而是您的数组。数组数组与指向指针的指针相同。

数组是内存的连续区域,数组数组是连续区域的连续区域,即所有数组都相互跟随。指向指针的指针可以看成是一个指针数组,内存布局完全不同。

也只有指针数组是共享的,而不是指针实际指向的。

【讨论】:

  • +1,一般来说,OP 在尝试为共享内存编写代码之前必须学习很多。代码中的转换数量已经让我头晕目眩,好的 C 代码通常不需要任何转换。
  • @JensGustedt 我希望你知道我们总是需要对 void* 指针进行大小写!我们从共享内存地址得到的
  • @Nidhi:你说的对 C 来说是不正确的——它只适用于 C++!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多