gpt4 book ai didi

c - 通过 char* 指针将结构传递给 main

转载 作者:行者123 更新时间:2023-11-30 17:13:18 26 4
gpt4 key购买 nike

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

也就是说,我正在开发一个项目,该项目使用 QEMU 作为将进程(最终是线程)从一台机器迁移到另一台机器的基础。我在 native 计算机上启动该进程,使用 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 到达解析选项的点之前从该点弹出最终指针;我稍后将在程序执行中使用此信息。问题只是如何首先将该结构体放入主函数中。

最佳答案

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



#include <iostream>
#include <cstring>

#define BUFSIZE 512
#define PACKETSIZE sizeof(MSG)

using namespace std;

typedef struct MSG
{
int type;
int priority;
int sender;
char message[BUFSIZE];
}MSG;

void serialize(MSG* msgPacket, char *data);
void deserialize(char *data, MSG* msgPacket);
void printMsg(MSG* msgPacket);

int main()
{
MSG* newMsg = new MSG;
newMsg->type = 1;
newMsg->priority = 9;
newMsg->sender = 2;
strcpy(newMsg->message, "hello from server\0");
printMsg(newMsg);

char data[PACKETSIZE];

serialize(newMsg, data);

MSG* temp = new MSG;
deserialize(data, temp);
printMsg(temp);

return 0;
}

void serialize(MSG* msgPacket, char *data)
{
int *q = (int*)data;
*q = msgPacket->type; q++;
*q = msgPacket->priority; q++;
*q = msgPacket->sender; q++;

char *p = (char*)q;
int i = 0;
while (i < BUFSIZE)
{
*p = msgPacket->message[i];
p++;
i++;
}
}

void deserialize(char *data, MSG* msgPacket)
{
int *q = (int*)data;
msgPacket->type = *q; q++;
msgPacket->priority = *q; q++;
msgPacket->sender = *q; q++;

char *p = (char*)q;
int i = 0;
while (i < BUFSIZE)
{
msgPacket->message[i] = *p;
p++;
i++;
}
}

void printMsg(MSG* msgPacket)
{
cout << msgPacket->type << endl;
cout << msgPacket->priority << endl;
cout << msgPacket->sender << endl;
cout << msgPacket->message << endl;
}

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

关于c - 通过 char* 指针将结构传递给 main,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30921999/

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