提问人:konradk 提问时间:11/14/2023 最后编辑:konradk 更新时间:11/14/2023 访问量:55
通过 IPC/网络在 C 中转储结构,哪种方法?[关闭]
Dumping struct's in C via IPC/network, which approach? [closed]
问:
假设我有一些数据类型,我们称之为 。
出于调试目的,我添加了Foo
foo_print(struct Foo *);
- 这会将每个字段转储到 stdout。
这可以很容易地更改为foo_print(FILE * file, struct Foo * foo);
现在,我想有一种方法可以执行相同的转储,但通过IPC发送,为此我使用的是Linux消息队列。因此,我现在没有文件,而是有缓冲区和文件描述符。 我可以使用 fdopen 传递该文件描述符,但我不确定这是否可行,因为它有点面向数据报。
或者我应该以某种方式使用 fmemopen() 打开缓冲区,所以我基本上会将描述符用于缓冲区?
如果这感觉很混乱,那么对不起,第一次处理这样的问题,我只想避免将 snprintf 与原始缓冲区写入一起使用并手动检查/更新边界。foo_snprintf(struct Foo*, char * buffer, size_t size);
或者也许有一种不同的方法?
编辑,上下文: 我有一个守护进程和一个CLI应用程序。整个逻辑是 CLI 发送一个命令来转储特定的东西,守护程序填充缓冲区,然后 CLI 打印对 stdout 的响应。 但现在我开始认为,与其通过 mqueue 发送转储,不如通过 FIFO 完成,该名称将通过 mqueue 从 Deamon 发送到 CLI。 目前,它很简单:
struct ipc_request {
uint32_t cmd;
};
struct ipc_response {
uint32_t cmd_status;
char output[RESP_OUTPUT_SIZE - sizeof(uint32_t)];
};
答: 暂无答案
评论
kinda datagram oriented.
all I want to avoid foo_snprintf
如果您在发送之前必须有一个完整的数据包,无论哪种方式最终都会做正在做的事情。您能澄清一下“面向数据报”的确切含义吗?为什么“使用 snprintf”是一件坏事?使用 snprintf 看起来非常简单,并且还使您的库更容易进行单元测试。snprintf