【发布时间】:2018-03-12 08:09:42
【问题描述】:
我正在关注 Linux 编程接口书(第 1004-1005 页)。
我知道这本书使用 C。但我想在 C++ 中实现相同的行为。即:进程间通过共享内存共享一个struct。
#include <iostream>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
using namespace std;
struct my_pair {
int a;
int b;
};
int main()
{
key_t key = ftok("aaaaa", 1);
int shmid = shmget(key, sizeof(my_pair), IPC_CREAT);
my_pair *numbers;
numbers = shmat(shmid, NULL, 0);
cout << numbers->a;
return 0;
}
它给了我这个错误:
shteste.cpp:在函数'int main()'中:
shteste.cpp:18: 错误:从 'void*' 到 'my_pair*' 的无效转换
我知道 C++ 更严格。如果我将 shmat 的返回值强制转换为 (my_pair *),它会编译但在执行期间会出现分段错误。
是否可以(如何)在 C++ 中使用 Linux/C 共享内存设施?
我正在编译:G++ 4.4.7:g++ shteste.cpp -o shteste -std=c++0x
谢谢...
编辑:按照所有建议,这是现在的代码:
int main()
{
key_t key;
if ((key = ftok("/home/alunos/scd/g11/aaaaa", 1)) == (key_t) -1) {
perror("IPC error: ftok"); exit(1);
}
int shmid = shmget(key , sizeof(my_pair), IPC_CREAT | 0640);
if (shmid == -1) {
perror("Could not get shared memory");
return EXIT_FAILURE;
}
my_pair *numbers;
void* mem = (my_pair*) shmat(shmid, NULL, 0);
if (mem == reinterpret_cast<void*>(-1)) {
perror("Could not get shared memory location");
return EXIT_FAILURE;
} else {
numbers = reinterpret_cast<my_pair*>(mem);
cout << numbers->a;
}
return EXIT_SUCCESS;
}
aaaaa 内容:notacat
[scd11@VM11 ~]$ ./shteste
无法获得共享内存:权限被拒绝
【问题讨论】:
-
您确定错误是由您显示的代码产生的吗?如果您没有演员表,我预计会出现此错误,如
numbers = shmat(...)。但是演员应该照顾好它。 -
你是对的......我复制了“固定”代码......我投射的那个(因此,不要抱怨转换)但出现分段错误。
-
您应该检查来自
shmget和shmat的返回值。 -
如果我用 strace 测试你的代码,我得到:“64 5327 shmget(0xffffffff, 8, IPC_CREAT|000) = 11534358 65 5327 shmat(11534358, NULL, 0) = -1 EACCES (Permission拒绝)”
-
C 允许隐式地将其他指针类型转换为
void*或从void*转换,C++ 要求您进行转换。
标签: c++ linux segmentation-fault ipc shared-memory