【问题标题】:Using shared memory in C在 C 中使用共享内存
【发布时间】:2014-05-26 18:30:44
【问题描述】:

我想创建一个服务器-客户端程序,其中两个进程使用共享内存在彼此之间传递信息

要传递的信息:

typedef struct shared_mem{
int board[BOARD_SIZE * BOARD_SIZE];
int goal;
}shared_mem;
shared_mem *msg;

服务器:

int main(int argc, char **argv) {

int shmid;
key_t key=ftok("2048_client", 42);
if(key == -1) {
        printf("ftok failed");
        return -1;
    }


shared_mem *shm;
msg=(shared_mem *)malloc(sizeof(shared_mem));

/*
     * Create the segment
    */
    if ((shmid = shmget(key, sizeof(msg), IPC_CREAT)) < 0) {
        perror("shmget");
        exit(1);
    }

    /*
    * Now we attach the segment to our data space.
    */
  if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
        perror("shmat");
        exit(1);
    }

msg=shm;

(*msg).goal=64;
}

客户:

int main(int argc, char **argv) {

int shmid;
key_t key=ftok("2048_client", 42);
if(key == -1) {
        printf("ftok failed");
        return -1;
    }
shared_mem *shm;
msg=(shared_mem *)malloc(sizeof(shared_mem));
/*
     * Create the segment.
    */
    if ((shmid = shmget(key, sizeof(msg), 0)) < 0) {
        perror("shmget");
        exit(1);
    }

    /*
    * Now we attach the segment to our data space.
    */
  if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
        perror("shmat");
        exit(1);
    }

msg=shm;
printf("dscsadc:  %d",msg->goal);
   }

我是共享内存的新手,我想了解它为什么不工作以及它应该如何工作。我收到“shmat:权限被拒绝”

【问题讨论】:

  • 怎么不工作?你得到什么错误?
  • 这里唯一看起来明显错误的事情是您必须为key 提供一个值(ftok 可能对此有所帮助),并且您可能也是需要将sizeof(msg) 舍入为sysconf(_SC_PAGESIZE) 的倍数。除此之外:这是什么你没想到的?
  • @Zack 我尝试使用 ftok 但我收到错误:shmat: Permission denied
  • 在服务器中,msg=shm; 行泄漏了精心分配的内存;删除 malloc() 行。同样在客户端。 (*msg).goal=64; 行通常会写成 msg-&gt;goal = 64;-&gt; 运算符的发明是有原因的。
  • @JonathanLeffler 我试过这样做,但我得到一个错误,说每个函数都定义了不止一次:2048.c:120:40:警告:不同指针类型的比较缺少强制转换[默认启用] /tmp/ccNMeNPm.o: 在函数main': 2048.c:(.text+0x45): multiple definition of main' /tmp/ccLsff3I.o:2048_client.c:(.text+0x0): 首先定义在这里 2048: 在函数move_board': (.text+0xaff): multiple definition of move_board' /tmp/ccNMeNPm。 o:2048.c:(.text+0xa1b): 首先定义在这里等等所有其他函数。

标签: c client-server shared-memory


【解决方案1】:

问题是你创建的共享内存段的权限是0000,所以没有人可以读写。

shmget() 调用从:

if ((shmid = shmget(key, sizeof(msg), IPC_CREAT)) < 0) {

到:

if ((shmid = shmget(key, sizeof(msg), IPC_CREAT|0600)) < 0) {

只有运行程序的用户才能访问创建的共享内存。

请注意,POSIX shmget() 说:

  • shm_perm.mode 的低九位设置为shmflg 的低九位。

【讨论】:

    【解决方案2】:

    如果您不仅限于 C,请查看 boost 库。它使您能够为进程间通信创建共享内存段。

    using boost::interprocess;
    shared_memory_object shm_obj
       (create_only,                  //only create
       "shared_memory",              //name
       read_write                   //read-write mode
       );
    

    http://www.boost.org/doc/libs/1_54_0/doc/html/interprocess/sharedmemorybetweenprocesses.html

    除此之外,您始终可以使用管道,或者如果您正在考虑使用 windows - COM。

    【讨论】:

    • 我仅限于 C,不允许使用 Pipes,我真的很想了解共享内存。
    • 对不起,我帮不上忙
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多