c - 无法创建共享内存C

标签 c unix ubuntu shared-memory

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

#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并且它没有说明任何内容或共享内存的创建权限。

问候

最佳答案

而不是

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

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

关于c - 无法创建共享内存C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14031240/

相关文章:

shell - 重命名 UNIX 目录中的文件 - shell 脚本

linux - erlang zip :unzip/1 {error, bad_central_directory} 和 {error, bad_eocd}

ubuntu - 在 Apache Airflow UI 中显示本地时间

linux - 如何列出所有 Linux 环境变量,包括 LD_LIBRARY_PATH

c - C 中的 size_t 是什么?

c - 在c程序中用sudo执行shell命令

python - 如果通过 strcpy() 获取用户输入,用户输入是否会被复制到超出空格或空字符的堆栈上

linux - 是否有可能完全管理流程及其分支的生命周期?

MySQL performance_schema 无法正常工作?

C:在矩形(本初子午线、赤道等)内查找点的边缘情况?