【问题标题】:64 bit shared memory segment C \ linux problems64位共享内存段C\linux问题
【发布时间】:2009-12-06 02:25:33
【问题描述】:

我希望在 C\Linux 中使用共享内存段做一些 IPC。

我继续像往常一样创建它:

typedef struct {
    int a[2];
} shm_segment;

...

shm_segment *shm;

int shm_id;
int shm_flags = IPC_CREAT | 0666
int shm_size = sizeof(struct shm_segment)
key_t key = 88899;
shm_id = shmget(key, shm_size, shm_flags); // ies this is in an if for error cheking but for example sake i omitted it

shm = (shm_segment*)shmat(shm_id, (void*)0, 0);

最后一行是中断的地方,在编译时它只给出一个:

Warning cast to pointer from integer of a different size.

根据我之前所做的,这段代码在 32 位机器上完美运行(没有警告)(没有测试完全相同的代码,但相同),但在我的 64 位机器上,它在编译时给出了这个警告。

在运行时会出现段错误。 根据我所做的研究,我相信从 void* 转换为我的指针会导致指针混乱,原因是 64 位。

任何想法我可以如何解决这些问题?或者是什么原因造成的?

【问题讨论】:

  • 既然可以使用NULL,为什么还要使用(void*)0

标签: c linux 64-bit shared-memory


【解决方案1】:

听起来您缺少正确的 shmat() 声明,因此编译器假定它返回 int

确保你有

#include <sys/shm.h>

在您的包含中。

【讨论】:

    【解决方案2】:

    摆脱演员表并包含正确的标题:

    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <sys/types.h>
    

    【讨论】:

    • 如果你一开始没有施放,你会得到更好的警告:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    相关资源
    最近更新 更多