c - 在 c 中的消息队列上进行类型转换

标签 c linux casting ipc

我目前正在尝试通过消息队列发送一个整数。我将此整数的地址类型转换为 (char *),因为将来我想接受其他数据类型,并且此数据在设计用于消息队列的结构中发送。

通过消息队列(我已验证其工作正常),我正在发送一个结构类型:

struct Type{

    long mtype;
    char *data;
};

要发送消息,从发送进程执行以下代码:

struct Type* ack = malloc(sizeof(struct Type));
int temp = 999;

ack->mtype = 1;
ack->data = (char *)&temp;


if(msgsnd(msqid, ack, sizeof(struct Type) - sizeof(long), 0) == -1){

          perror("Sending acknowledgement to producer\n");

}

在接收端,然后执行以下操作:

struct Type *rack = malloc(sizeof(struct Type));

rack->mtype = 1;

//Wait for acknowledgement from server
if(msgrcv(prodmsqid, rack, sizeof(struct Type) - sizeof(long), 0, 0) == -1){ 

       perror("msgrcv for acknowledgement from server");

            exit(1);


 }
 printf("Acknowledgement has arrived: %d\n",(int)rack->data);

此 printf 的输出从非常大的数字 (8171536) 到 4 不等。

最佳答案

我认为问题在于您传递的是堆栈上的地址,int 地址转换为 char 地址。但是该 int 位置在发送后立即超出范围。如果我的看法是正确的,一种解决方法是将 int 位置设为全局。

关于c - 在 c 中的消息队列上进行类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30557070/

相关文章:

linux - 使用 bash 删除 Javascript 单行注释

java - 在 Java 中将形状转换到组件中?

c - 将多维可变长度数组传递给函数

c++ - 是否有将信号处理(c 库)映射到 c++ 异常的可能方法?

c - 在 CDT 之外使用 Eclipse CDT 解析器

arrays - 按类型过滤 Swift [AnyObject] 数组

c++ - 我如何信任从 double 到整数的转换?

c++ - 对于 C/C++ 中的数组分配,这些额外的代码是否需要没有错误?

linux - 移动照片并重命名它们(如果存在)?

linux - 命令运行时如何简化输出文件