首页 > 解决方案 > 如何通过管道发送序列化的动态分配结构

问题描述

目前,这些值不会从原始结构复制到接收器结构。所以输出看起来只是垃圾。

有人可以帮助解释为什么这些值没有被正确复制吗?

结构定义:

    typedef struct data {
        int var1;
        int var2;
    } Data_t;

序列化和反序列化函数:

char* serialize_Data_t(Data_t* a_dataT) {
    int size = 2*sizeof(int);
    char* buffer = (char*)malloc(sizeof(char)*(size+1));
    if (buffer == NULL) {
        perror("Sorry out of memory\n");
        buffer = NULL;
        return buffer;
    }
    memcpy(buffer, &a_dataT->var1, sizeof(int));
    memcpy(buffer + 2*sizeof(int), &a_dataT->var2, sizeof(int));
    return buffer;
}

void deserialize_Data_t(char* a_buffer, Data_t* a_receiver) {
    memcpy(&a_receiver->var1, a_buffer, sizeof(int));
    memcpy(&a_receiver->var2, a_buffer+2*sizeof(int), sizeof(int));
}

在 main 我为两个结构分配内存并初始化它们的值

Data_t* original = GetData();
Data_t* receiver = GetData();
original->var1 = 5;
original->var2 = 1234;
receiver->var1 = -1;//just for testing
receiver->var2 = -1;//just for testing

我将原始结构发送到序列化函数并将其放入 char* 缓冲区

buffer = serialize_Data_t(original);

然后我在子进程中写那个缓冲区

if (pid == 0) {
   close(pfds[0]);
   write(pfds[1], buffer, sizeof(buffer));
   printf("Writing in child process...\n");
   sleep(2);
   return 0;
}

并在父进程中反序列化并打印结果

if (pid > 0) {
   wait(NULL);
   close(pfds[1]);
   read(pfds[0], r_buff, sizeof(buffer));
   deserialize_Data_t(r_buff, receiver);
   printf("Parent Process %d and %d\n", receiver->var1, receiver->var2);
   close(pfds[0]);
}

标签: cserializationstructpipedeserialization

解决方案


推荐阅读