为什么可以';尽管设置了O_CREAT,但我是否打开共享内存对象?
我有一个小型C程序,它可以打开/创建一个为什么可以';尽管设置了O_CREAT,但我是否打开共享内存对象?,c,linux,shared-memory,C,Linux,Shared Memory,我有一个小型C程序,它可以打开/创建一个shm区域,如下所示: s = shm_open("/run/shm/procman_power", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR); if(s >= 0) printf("s = %d\n",s); else perror("shm_open"); 但当我执行它时,我得到的是: $ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1
shm
区域,如下所示:
s = shm_open("/run/shm/procman_power", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
if(s >= 0) printf("s = %d\n",s);
else perror("shm_open");
但当我执行它时,我得到的是:
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 73G 23G 47G 33% /
udev 490M 4.0K 490M 1% /dev
tmpfs 199M 784K 198M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 497M 360K 497M 1% /run/shm
none 100M 72K 100M 1% /run/user
$ gcc shmtest.c -o shmtest -lrt
$ ./shmtest
shm_open: No such file or directory
为什么它不创造它?几天前我确实让它工作了,现在它不知怎么坏了…共享内存对象不是普通的文件系统路径,它们只是抽象名称空间中的名称。根据报告: 对于便携式使用,共享内存对象应以
/somename
形式的名称标识;也就是说,一个以null结尾的字符串,最多包含NAME_MAX
(即255)个字符,由一个初始斜杠组成,后跟一个或多个字符,其中没有一个字符是斜杠
因此,我建议使用对象名,例如“/procman\u power”
,而不是您正在使用的名称
还要注意,
shm_open
在成功时返回一个非负整数,因此0
将是有效的成功代码,而不是失败代码。您应该检查如果(s>=0)
以测试它是否成功。您正在编译一个程序并命名编译结果shmtest
,但您正在运行/shmtestshm\u open:
。。。这是一个shell脚本,或者是一个不同的程序,或者是完全其他的东西?或者,您的终端会话的副本可能以某种方式失败。是的!只是一个打字错误,经过编辑。谢谢你指出这一点!谢谢!就这样。问题是我以前让它工作过,按照您所说的设置名称。在那之后,我更改了名称,认为它应该指向一个“路径”(虽然我知道它不是一个实际的文件),它继续工作(奇怪,不是吗?)。重新启动后,我再次运行程序,突然意识到shm\u open
不起作用。如果(s>=0)
只是一个打字错误,谢谢你指出这一点!