簡體   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