2013-03-14 86 views
1

我一直有一个shmget的问题现在几个小时,我似乎无法弄清楚。每次我尝试拨打电话时都会收到一个EINVAL:“无效的参数”错误。shmget()给EINVAL错误

代码的重要的部分是如下:

key_t generate_ipc_key() 
{ 
    key_t ipc_key = ftok(__FILE__, KEY); 
    if(ipc_key < 0) { 
     perror("Failed to Generate IPC Key"); 
     exit(IPC_FAILURE); 
    } 

    return ipc_key; 
} 

int shared_memory_create(size_t memory_size) 
{ 
    int shm_key = shmget(generate_ipc_key(), memory_size, IPC_CREAT | 0666); 
    if(shm_key < 0) { 
     perror("Failed to Create Shared Memory Key"); 
     exit(CREATE_FAILURE); 
    } 

    return shm_key; 
} 

该函数被调用:

shm_key = shared_memory_create(sizeof(data_t)); 

凡data_t是一个结构:

typedef struct { 
    int hCount; 
    int oCount; 
    int bCount; 
} data_t; 

同样在它有助于共享内存的值是:

kernal.shmmax = 33554432 
kernal.shmall = 2097152 
kernal.shmmni = 4096 

我对C相当陌生,所以我确信这是简单的东西我很想念但是我似乎无法弄清楚。任何帮助表示赞赏!

我不确定它到底是什么,ipcs显示没有共享段,我重新启动,现在它工作。

+0

这可能有帮助。 EINVAL!=“无效参数”。 EINVAL =将创建一个新段,并且'size SHMMAX',或者不创建新段,具有给定键的段存在,但大小大于该段的大小。手册页。检查'memory_size'参数。 – yeyo 2013-03-14 01:07:25

+1

@Kira:我得到了errno 22,这是我的系统上的EINVAL。 – pal25 2013-03-14 01:12:46

回答

1

手册页说:

EINVAL A new segment was to be created and size < SHMMIN or 
size > SHMMAX, or no new segment was to be created, a 
segment with given key existed, but size is greater than 
the size of that segment. 

所以,检查是否有这些应用。 您可以运行ipcs工具列出现有的共享内存段,并查看您的程序是否与其中任何一个冲突。请注意,共享内存段在您的流程结束后仍然存在。

+1

我不相信shmmni是最小尺寸。这是可以创建的共享内存段的最大数量。尽管如此,我同意你的其余部分,他们可能需要增加大小。问题是这个价值应该是什么。 – spdaley 2013-03-14 02:04:06

+1

我实际上试了一下,看看这是不是问题,并将其设置为关闭2097152,仍然没有骰子。我实际上并不认为有一个SHMMIN,我试过了,它显然是1个字节。 – pal25 2013-03-14 03:36:42

+0

@spdaley是的,你是对的,这是常量SHMMIN,而不是kernel.shmmni – nos 2013-03-14 09:23:27