【发布时间】:2011-12-20 17:52:14
【问题描述】:
在第二个参数不为 NULL 的情况下使用 shmget 时收到消息“无效参数”。
编译正常,但执行时出现此错误消息。
我整天都被困在这个问题上。希望你能帮我! :)
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
int idSharedMem;
int *varSharedMem1;
int *varSharedMem2;
/* Create the shared memory */
idSharedMem = shmget((key_t) 0001, sizeof(int), IPC_CREAT | 0666);
if (idSharedMem == -1)
{
perror("shmget");
}
/* Allocate a memory address and attached it to a variable */
varSharedMem1 = shmat(idSharedMem, NULL, 0);
if (varSharedMem1 == (int *) -1)
{
perror("shmat1");
}
/* Sign a value to the variable */
*varSharedMem1 = 5;
/* Attach an existing allocated memory to another variable */
varSharedMem2 = shmat(idSharedMem, varSharedMem1, 0);
if (varSharedMem2 == (int *) -1)
{
/* PRINTS "shmat2: Invalid argument" */
perror("shmat2");
}
/* Wanted it to print 5 */
printf("Recovered value %d\n", *varSharedMem2);
return(0);
}
【问题讨论】:
-
你没有说明哪个函数给你错误。如果
shmget-- 在你的平台上'SHMMIN' 的值是多少?如果小于sizeof(int),则这是记录在案的预期行为。 -
你能解释第二次调用
shmat应该做什么吗?代码没有任何意义,至少对我来说。而且我无法弄清楚它的目的应该是什么。如果您要再次映射同一段,为什么要传入varSharedMem1?您可以尝试做一些事情。一个最好由varSharedMem2=varSharedMem1;完成。另一个最好通过传递NULL作为第二个参数来完成。照原样,我无法弄清楚您希望通过该电话完成什么。 -
@DavidSchwartz
echo $SHMMIN返回空白 :( 我做得对吗?我是 unix 的新手。我知道我可以简单地将一个指针分配给另一个,但我必须使用第二个参数。这是第二个参数应该做的对吗?至少这是我从手册中理解的。感谢您的回答! -
你在做什么对吗?我不知道你想做什么。据我所知,您似乎正试图在第一个映射之上创建第二个映射,但这没有任何意义。如果这就是你想要做的,那就不要这样做——它已经被映射了。如果您尝试做其他事情,请解释一下其他事情是什么是!
-
谢谢,大卫!这是您所说的,但我可以在@nos 帖子上很好地理解它。如果我做得对,我正在做的正确的事情是回显 SHMMIN 系统变量:p
标签: c linux unix shared-memory