通过 IPC/网络在 C 中转储结构,哪种方法?[关闭]

Dumping struct's in C via IPC/network, which approach? [closed]

提问人:konradk 提问时间:11/14/2023 最后编辑:konradk 更新时间:11/14/2023 访问量:55

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章用事实和引文来回答。

8天前关闭。

假设我有一些数据类型,我们称之为 。 出于调试目的,我添加了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)];
};
C Linux IPC的

评论

1赞 Harith 11/14/2023
如果要写入文件描述符,可能需要查看以下内容: stackoverflow.com/questions/39669257/how-to-use-dprintf
0赞 KamilCuk 11/14/2023
kinda datagram oriented. all I want to avoid foo_snprintf如果您在发送之前必须有一个完整的数据包,无论哪种方式最终都会做正在做的事情。您能澄清一下“面向数据报”的确切含义吗?为什么“使用 snprintf”是一件坏事?使用 snprintf 看起来非常简单,并且还使您的库更容易进行单元测试。snprintf
0赞 Some programmer dude 11/14/2023
最大的问题是:你想有多便携?您是否希望您的程序能够在其他 POSIX 系统(如 macOS)上构建和运行?在 Windows 上?在带或不带操作系统的嵌入式系统上?还是永远只在 Linux 上运行?
0赞 Some programmer dude 11/14/2023
此外,这是否用于 IPC?也就是说,在单个系统上本地进行进程之间的通信?它永远不会通过网络连接到其他系统吗?那么,根据结构本身,为什么不“按原样”发送呢?
0赞 Some programmer dude 11/14/2023
还有大量可用的序列化库,包括文本(例如 JSON)和二进制格式。对于工作任务,我宁愿研究这样的图书馆,而不是试图自己制作。特别是如果将来需要发送更多结构。

答: 暂无答案