【问题标题】:Passing struct to main via char* pointer通过 char* 指针将结构传递给 main
【发布时间】:2015-06-18 17:32:09
【问题描述】:

我要问的是有点 hacky(因为这是解决问题的一种非常糟糕的方法)-我理解这一点,并且不打算将其用作长期解决方案,仅用于证明-概念。

也就是说,我正在开展一个项目,该项目使用 QEMU 作为将进程(最终是线程)从一台机器迁移到另一台机器的基础。我在本机机器上启动进程,使用 ptrace 暂停它,然后复制 CPU 的寄存器和堆栈并将这些值推送到新创建的 QEMU 实例(具有相同的底层架构,即 x86-64 --> x86_64,ARM64 --> ARM64)。然后我(最终)在 QEMU 中恢复执行。

我已经到了需要将寄存器 + 堆栈传递到 QEMU 的阶段,但是我遇到了一些障碍;理想情况下,我会拆分 QEMU 并将整个程序编译为我自己程序的一部分,但这就是概念验证发挥作用的地方。 QEMU 是一个庞大的程序,分解/重建 Makefile 是我现在不太热衷于处理的事情。所以...

我是否可以在我的程序中用寄存器 + 堆栈填充一个结构,创建一个指向该结构的指针,将该指针转换为 char*,然后将该 char* 指针传递给 execlp,以便重新转换(修改版)QEMU?目标是从 QEMU 中访问这些值。例如:

struct regs_and_stack my_struct = {...};
struct regs_and_stack *my_struct_ptr = &my_struct;
execlp("qemu", "qemu", "test", "100000", (char*)my_struct_ptr);

如果需要,我可以发布我的其余代码以更好地了解全局。一如既往,感谢您的帮助!!!

编辑

我已经确定了 qemu 主函数 (linux-users/main.c) 中的点,在该点我可以从 argv 中弹出最终指针,然后再到达它通过选项解析的点;稍后我将在程序执行中使用这些信息。问题是首先如何将这个结构体放入主函数中。

【问题讨论】:

  • 这个问题似乎太宽泛了。只是一个小提示:请注意,您必须迁移进程的整个状态。这将包括堆和分配块的确切布局(想想动态结构中的指针。
  • 我不明白您要做什么,但我怀疑它不会这样做。 execlp 以空字符结尾的字符串作为参数。 qemu 期望特定的字符串作为参数。所以我不明白通过传递一些二进制数据会得到什么。
  • @Olaf - 我忘记了堆,但它是可行的;更广泛的项目涉及完整的操作系统,因此我必须实现它并根据需要转换堆栈/堆。问题实际上是关于将指针传递给结构 - 抱歉添加了太多无关信息!
  • @EugeneSh。 - 我已经确定了 qemu 中需要修改的主要功能;我计划在将它传递给程序的其余部分之前从 argv 列表中弹出这个指针。在我继续前进之前,我只需要将这个结构体放入 qemu 中,这似乎是一种可能的快速而肮脏的方法。
  • 不,这行不通。因为 1) 它不是同一个指针。 2)数据可能根本没有终止,或者在中间终止。如果你真的想通过命令行将一些数据传递给 qemu - 以文本方式进行。

标签: c pointers struct qemu


【解决方案1】:

在这里,如果我理解得很好,您想序列化您的结构,然后在另一端反序列化它们。 以下代码片段形成了这个问题的答案Serialization of struct 要解决问题,您必须编辑自己的序列化和反序列化函数,因为它们取决于您的 strut 的结构。只需跳过 q 变量即可为您的 structs 变量打开一个适合文本序列的位置。

#include 
#include 

#define BUFSIZE 512
#define PACKETSIZE sizeof(MSG)

使用命名空间标准;

typedef结构味精
{
    整数类型;
    int 优先级;
    发件人;
    字符消息[BUFSIZE];
}味精;

无效序列化(味精* msgPacket,字符*数据);
无效反序列化(字符*数据,味精* msgPacket);
无效 printMsg(MSG* msgPacket);

主函数()
{
    味精* newMsg = 新味精;
    新消息->类型 = 1;
    新消息->优先级 = 9;
    新消息->发件人 = 2;
    strcpy(newMsg->message, "来自服务器的你好\0");
    打印消息(新消息);

    字符数据[PACKETSIZE];

    序列化(新消息,数据);

    味精* 温度 = 新味精;
    反序列化(数据,临时);
    打印信息(温度);

    返回0;
}

无效序列化(MSG* msgPacket,char *data)
{
    int *q = (int*) 数据;
    *q = msgPacket->类型; q++;
    *q = msgPacket->优先级; q++;
    *q = msgPacket->发送者; q++;

    字符 *p = (字符 *)q;
    诠释 i = 0;
    而 (i 消息[i];
        p++;
        我++;
    }
}

无效反序列化(字符*数据,味精* msgPacket)
{
    int *q = (int*) 数据;
    msgPacket->type = *q; q++;
    msgPacket->优先级 = *q; q++;
    msgPacket->sender = *q; q++;

    字符 *p = (字符 *)q;
    诠释 i = 0;
    而 (i 消息[i] = *p;
        p++;
        我++;
    }
}

无效 printMsg(MSG* msgPacket)
{
    cout type 优先级 sender 消息 

这个链接也很有用: stackoverflow.com/questions/1653681/serialization-deserialization-of-a-struct-to-a-char-in-c

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-15
    • 2017-01-27
    • 2019-09-19
    • 2020-05-15
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    相关资源
    最近更新 更多