一旦前者被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线程中获取“参数”变量并将其提供给工作线程;然后,工作线程从服务器获取所需数据(缩小图像)并返回到客户端。
答案 0 :(得分:1)
没有标签的两个联合(或结构)被认为是不同的类型,即使它们具有相同的声明。不同的联合(或结构)是不兼容的(在翻译单元内)。
要在多个地方使用相同的联合,首先使用标记声明它:
union MyTag { contents of union… };
然后使用其标记名称引用它,如union MyTag argument;
。