【问题标题】:Seg Fault Using a Struct in Shared Memory在共享内存中使用结构的 Seg Fault
【发布时间】:2013-03-24 22:19:25
【问题描述】:

我提前为我的无知道歉,这给我带来的麻烦比它应该的要多得多,但我已经把头撞到办公桌上好几个小时了,试图找出我做错了什么。我想编写一个具有存储结构的共享内存的应用程序。出于某种原因,我无法开始着手,我一直在访问我的结构成员时遇到段错误。

#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);
}

更新:谢谢大家,我的系统管理员正在运行诊断程序并以某种方式禁用了共享内存。

【问题讨论】:

  • 我刚刚尝试了您发布的代码,它编译并运行良好

标签: c shared-memory


【解决方案1】:

您的代码在我看来并不坏。唯一明显的缺失是对传递的参数数量进行某种检查,例如:

if (argc != 2)
  return 1;

您是否可能错过了使用参数调用程序。在这种情况下,它会是

atoi (argv[1]) 

这会导致您的段错误。

顺便说一句:另外检查 shmgetshmat 的返回值也可能是个好主意。

【讨论】:

  • 啊,很好,当我运行代码时,我只是传递了一个参数,假设 OP 也在这样做。
  • 虽然我在第一次尝试时错过了它:) 因为 OP 可能也丢失了。
  • 请记住 atoi() 已被弃用。看看 strtol() 吧。
猜你喜欢
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
相关资源
最近更新 更多