【问题标题】:Unable to create Shared Memory C [closed]无法创建共享内存 C [关闭]
【发布时间】:2012-12-11 11:02:12
【问题描述】:

以下代码总是返回-1 用于创建共享内存。我不知道它的原因。据我所知,我的代码是正确的。 Perror returns not such file or directory。我不知道它指向什么,但是这个文件和标题在同一个目录中。代码如下:

#include "MyShared.h"


int main()
{
struct MyShared *obj;

int shmid,i,childpid;

shmid=shmget(MySharedKey,sizeof(struct MyShared),PERM);
if(shmid==-1)
    printf("Failed to create shared mem\n");
obj=(struct MyShared*)shmat(shmid,NULL,0);

obj->ReadFromBuf=0;
....
}

这是头文件。 My Shared.h

#ifndef MYSHARED_H_INCLUDED
#define MYSHARED_H_INCLUDED

#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>


#define PERM (S_IRWXU | S_IRGRP)
#define MySharedKey 564732
#define SIZE 512  // 512 bytes

struct MyShared
{
    char buf[SIZE];

    int ReadFromBuf,WriteToBuf,readbytes;
};

#endif

为什么这段代码不能创建共享内存?

我使用的是 ubuntu 10.04。

我正在关注Unix System programming by Stevens,它没有说明任何内容或共享内存的创建权限。

问候

【问题讨论】:

标签: c unix ubuntu shared-memory


【解决方案1】:

代替

printf("Failed to create shared mem\n");

更好的使用

perror("Failed to create shared mem");

这会评估 errno 变量并打印更有用的错误消息,在您的情况下类似于

Failed to create shared mem: No such file or directory

原因是你试图附加到一个不存在的内存段。

为了创建共享内存段,您需要将IPC_CREAT 标志传递给shmget()

shmid=shmget(MySharedKey,sizeof(struct MyShared),PERM | IPC_CREAT);

另见http://www.kernel.org/doc/man-pages/online/pages/man2/shmget.2.html

如果您没有传递此标志,则假定共享内存段已经存在并且您的进程想要附加到它。这就是想要访问共享内存段的 从属 进程需要完成的事情,一旦它由某个 进程创建。

【讨论】:

  • +1 以获得好的答案并提及错误
【解决方案2】:

首先,您丢失了一些头文件。

#include <sys/types.h>  
#include <sys/ipc.h>
#include <sys/shm.h>

其次,shmget()函数的第一个参数是key_t类型。所以你必须使用fotk()函数来生成密钥。

示例:
Myshared.h

#ifndef _MYSHARED_H
#define _MYSHARED_H

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define FLAG (IPC_CREATE | IPC_EXCL)
#define SIZE 512

typedef struct {
        char buf[SIZE];
        int read_from_buffer, write_to_buffer, read_bytes;
} Shared;

#endif

Myshared.c

#include "Myshared.h"
#include <stdio.h>

int main(int argc, char **argv)
{
        key_t key; 
        int shmid;

        key = ftok("/dev/null", 0);  # /dev/null just a example
        shmid = shmget(key, sizeof(struct Shared), FLAG);
        if (shmid == -1) {
                perror("Create Shared Memory Error:");
        }
        ......
}

最后,您可以输入man ftokman shmget 来帮助自己。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 2010-11-30
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    相关资源
    最近更新 更多