Can';t定义共享内存对象的大小

Can';t定义共享内存对象的大小,c,unix,posix,shared-memory,C,Unix,Posix,Shared Memory,您好,我正在尝试使用POSIX函数创建一个共享内存对象,但遇到了一个奇怪的错误 //创建共享内存 if( (shmid = shm_open("/OS", O_CREAT ,0700)) == -1){ printf("Error creating memory\n"); exit(1); } printf("shmid: %d\n", shmid); if (ftruncate(shmid, sizeof(int)) == -1){ printf("Error d

您好,我正在尝试使用POSIX函数创建一个共享内存对象,但遇到了一个奇怪的错误

//创建共享内存

if( (shmid = shm_open("/OS",   O_CREAT ,0700)) == -1){
    printf("Error creating memory\n");
    exit(1);
}
printf("shmid: %d\n", shmid);

if (ftruncate(shmid, sizeof(int)) == -1){
    printf("Error defining size\n");
    exit(1);
}
正如您可以想象的,它一直打印出“错误定义大小”。
shmid打印的值为3,为有效值。但是由于一个错误,ftruncate()函数返回-1。。。设置为errno的值是22,正如我在互联网上看到的,这是由于“无效参数”,但我不明白为什么。。。。建议?

在Linux系统上,
22
errno
值是
EINVAL
。您应该使用
perror
strerror(errno)
来获取类似“无效参数”的文本错误消息,而不是显示数字值

使用

列表的POSIX文档:

[EBADF]
[EINVAL]
- fildes参数不是为写入而打开的文件描述符

[EINVAL]
- fildes参数引用未经写入权限打开的文件

美国的Linux手册页

EBADF
EINVAL
- fd不允许写入


在SystemV IPC(我知道您没有使用)下,有一个最小大小的共享内存段作为内核配置参数。也许这也适用于POSIX共享内存,也许
sizeof(int)
太小了。您是否尝试过从
ftruncate()
(使用
perror()
,或
errno
strerror()
,或…)打印错误号?您已经用标签标记了这个问题,这表明您可能没有使用Linux;你在哪个站台上跑步?是的!我已经打印出errno,它返回22,正如我所说的。根据我读到的内容,在使用ftruncate()之前,大小被设置为0字节,sizeof(int)应该是4字节。我没有注意到这一点-检查/usr/include/sys/errno.h中的22是否为EINVAL(很可能是;或者使用
peror()
向您提供相应的错误消息)。当您从
ftruncate()
获取EINVAL时,有两种可能性-要么
shmid
错误,要么大小错误。由于您检查了
shmid
,它看起来是正确的,这很可能意味着大小错误。您是否应该为
shm\u open
指定
O|RDWR | O_create
ftruncate
at的文档列出“[EBADF]或[EINVAL]fildes参数不是一个可供写入的文件描述符。”或“[EINVAL]fildes参数引用了一个未经写入权限打开的文件。”@snepyribos当然您必须指定
O|RDWR | O|u create
。它不必按特定的顺序按位排列,也不必是可交换的。
if ((shmid = shm_open("/OS", O_RDWR | O_CREAT, 0700)) == -1){