联合作业

时间:2018-04-21 22:38:25

标签: c rpc

一旦前者被svc_getargs()RPC调用填充,我试图将XDR联合分配到结构联合中。但是,当我这样做时,我收到“类型不兼容”错误。我也尝试过memcpy()但同样的问题。以下是我的代码。感谢帮助。

struct data_str {
    struct svc_req *rqstp;
    SVCXPRT *transp;
    bool_t retval;
    xdrproc_t _xdr_result;
    //outputImage get_minified_image_1_res;
    //inputImage get_minified_image_1_arg;
    union {
        inputImage get_minified_image_1_arg;
    } argument;
    bool_t (*local)(char *, void *, struct svc_req *);
};

static void
minify_image_program_1(struct svc_req *rqstp, register SVCXPRT *transp) {

    struct data_str *req_holder;
    union {
        inputImage get_minified_image_1_arg;
    } argument;
    union {
        outputImage get_minified_image_1_res;
    } result;
    xdrproc_t _xdr_argument, _xdr_result;
    bool_t (*local)(char *, void *, struct svc_req *);

    req_holder = malloc(sizeof(*req_holder));
    req_holder->rqstp = rqstp;
    req_holder->transp = transp;

    memset((char *) &argument, 0, sizeof(argument));
    if (!svc_getargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
        svcerr_decode(transp);
        return;
    }
    req_holder->_xdr_result = _xdr_result;
    req_holder->argument = argument; // THIS IS WHERE I GET THE ERROR
    req_holder->local = local;
    return;
}

修改 更多背景。这是一个项目,它有两个部分围绕远程过程调用(RPC) - 第一个是单线程服务器,第二个是多线程服务器。上面的代码是第二部分,我试图修改RPC的自动生成的“svc”,使其具有boss-worker模式的多线程(MT)。自动生成的文件适用于单线程部分。但对于MT部分,我需要从Boss线程中获取“参数”变量并将其提供给工作线程;然后,工作线程从服务器获取所需数据(缩小图像)并返回到客户端。

1 个答案:

答案 0 :(得分:1)

没有标签的两个联合(或结构)被认为是不同的类型,即使它们具有相同的声明。不同的联合(或结构)是不兼容的(在翻译单元内)。

要在多个地方使用相同的联合,首先使用标记声明它:

union MyTag { contents of union… };

然后使用其标记名称引用它,如union MyTag argument;