Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';尽管设置了O_CREAT,但我是否打开共享内存对象?_C_Linux_Shared Memory - Fatal编程技术网

为什么可以';尽管设置了O_CREAT,但我是否打开共享内存对象?

为什么可以';尽管设置了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

我有一个小型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        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)
只是一个打字错误,谢谢你指出这一点!