gpt4 book ai didi

c++ - Linux 共享内存与 C++ : Segmentation Fault

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:19:28 30 4
gpt4 key购买 nike

我正在阅读 Linux Programming Interface 一书(第 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: In function 'int main()':

shteste.cpp:18: error: invalid conversion from 'void*' to 'my_pair*'

我知道 C++ 更严格。如果我将 shmat 的返回转换为 (my_pair *),它会编译但在执行期间会出现段错误。

是否可以(如何)将 Linux/C 共享内存设施与 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

Could not get shared memory: Permission denied

最佳答案

这可能是权限问题。您可以检查 shmgetshmat 的返回值,并使用 perror 打印这样一条人类可读的错误消息。

#include <iostream>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.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 | 0777);
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;
}

关于c++ - Linux 共享内存与 C++ : Segmentation Fault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46505446/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com