我对shmget有几个小时的问题了,现在我似乎搞不清楚了。每次我尝试调用got 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没有显示共享段,我重新启动,现在它开始工作了。
发布于 2013-03-14 01:14:41
手册页上写着:
EINVAL一个新段将被创建,大小< SHMMIN或size > SHMMAX,或者不创建新段,存在一个具有给定键的段,但大小大于该段的大小。
所以,检查其中任何一个是否适用。您可以运行ipcs工具来列出现有的共享内存段,并查看您的程序是否与其中的任何部分发生冲突。注意,共享内存段在进程结束后仍然存在。
https://stackoverflow.com/questions/15399369
复制相似问题