以下代码始终返回-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
并且没有对共享内存说任何内容或创建权限。
此致
答案 0 :(得分:3)
而不是
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
如果您没有传递此标志,则假定共享内存段已存在且您的进程想要附加到该标记。这是您的 slave 进程需要完成的操作,这些进程一旦由某个主进程创建,就会访问共享内存段。
答案 1 :(得分:0)
首先,你失去了一些头文件。
#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 ftok
和man shmget
来帮助自己。