在嵌入式Linux中使用setvbuff修改stdout缓冲是安全/合理的事情吗?

问题描述 投票:0回答:1

我有一个 C/C++ 程序,它作为 systemd 服务运行,使用 stdout 和 stderr 的默认配置,又名journald(

journalct -u SERVICE
)。我想用journald查看我的printf调用,这是我以合理的方式查看它们的唯一方法时间范围是如果我使用
setvbuff(stdout, nullptr, 0, _IOLBF)
合理的意思是我没有看到任何没有行缓冲或没有缓冲的输出(
_IOLBF
/
_IONBF

我的问题实际上是想了解使用 setvbuff 修改缓冲是否是合理的事情。我发现行缓冲比完全缓冲慢,如此处所示stackOverflow post,但如果没有行缓冲或没有缓冲,我不会从日志中的程序中获得任何输出。 Printf 在运行二进制文件以及设置

StandardOutput=tty
时工作正常。

节目简介: 这是一个相当大的嵌入式linux程序,作为前端。还有其他三个服务本质上是具有相同问题的后端。 我想 100% 确定这是一件安全的事情,因为这个嵌入式程序将在高度监管的领域中使用,并且不能承受内存泄漏/其他内存问题,并且这些 printfs 用作调试日志。

服务配置文件:

[Unit]
Description="UI service"

[Service]
ExecStart=/home/root/startBinary
Restart=always

[Install]
WantedBy=multi-user.target

相关的system.conf行(默认情况下未编辑):

#DefaultStandardOutput=journal
#DefaultStandardError=inherit

未修改缓冲的

journalctl -u SERVICE
输出示例:

Aug 09 08:29:54 computername systemd[1]: Starting SERVICE...

示例

journalctl -u SERVICE
带行缓冲/无缓冲:

Aug 09 08:32:20 computername systemd[1]: Starting SERVICE...

Aug 09 08:32:21 computername systemd[1]: Hello world from SERVICE printf

在不修改 buffer 方法的情况下,我还没有看到我的 printf 到达journald。

我尝试使用

setvbuff(stdio, nullptr, 0, _IOLBF)
并得到了我想要的结果。

c embedded-linux systemd buffering systemd-journald
1个回答
0
投票

从技术上讲,这取决于你的 libc 实现它的程度(因为 I/O 缓冲是由 libc 提供的),但通常是安全的,因为对于某些输出来说,默认情况下已经发生了这种情况(当 stdout 是一个时,行缓冲是默认的) tty,如果我没记错的话,它是 stderr 的默认值),并且无论如何你仍然使用相同的底层机制 - 它仅在输出被刷新时改变,而不是操作中的基本内容。 [这不应被视为提供 100% 的保证。]

© www.soinside.com 2019 - 2024. All rights reserved.