繁体   English   中英

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

[英]Passing struct to main via char* pointer

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

就是说,我正在一个项目中,该项目使用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中弹出最终指针。 我将在程序的执行中使用此信息。 问题是,首先如何使该结构成为主要功能。

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

#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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM