热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在没有stdbuf和类似工具的情况下解除传统运行二进制文件的stdout

如何解决《如何在没有stdbuf和类似工具的情况下解除传统运行二进制文件的stdout》经验,为你挑选了1个好方法。

我想监视我将要开始的程序的实时输出.我试图通过将程序的输出重定向到管道,然后从监视脚本中读取管道来实现此目的.

./program >> apipe

然后从监控脚本

cat apipe

但是由于>>中的缓冲区,没有输出.无论如何我可以禁用此缓冲区?我在一个准系统嵌入式系统(petalinux)上运行,因此我无法访问unbuffer,脚本或stdbuf来帮助我.

我已经尝试了另一个平台上的脚本,其中unbuffer可用,它可以正常工作.

我可以用任何方式配置这个缓冲区,或使用另一个二进制文件来重定向?

编辑:我无法访问我尝试运行的命令的源代码.它是传统的二进制文件.



1> randomir..:

如果您没有访问stdbuf,你还不如模拟它和非缓冲的stdout手动gdb(假设很明显,你可以访问gdb).

我们来看看stdbuf实际运作情况.的stdbufGNU的coreutils命令基本上只注入libstdbuf在用户程序通过设置LD_PRELOAD环境变量.(不相关,但为了记录,选项通过_STDBUF_E/ _STDBUF_I/ _STDBUF_Oenv vars 传递.)

然后,当libstdbuf运行时,它setvbuf在适当的文件描述符(stdin/ stdout/ stderr)上调用libc函数(进而执行底层系统调用),具有适当的模式(完全缓冲,行缓冲或无缓冲).

宣言setvbufstdio.h,可提供man 3 setvbuf:

#include 

int setvbuf(FILE *stream, char *buf, int mode, size_t size);

对于价值观mode是:_IONBF,_IOLBF,_IOFBF,中定义stdio.h.我们这里只对无缓冲模式感兴趣:_IONBF.它的值为2(你可以查看你的/usr/include/stdio.h).

Unbuffer脚本

所以,要stdout为某个进程取消缓冲,我们只需要调用:

setvbuf(stdout, NULL, _IONBF, 0)

我们可以轻松地做到这一点gdb.让我们制作一个我们可以调用的脚本unbuffer-stdout.sh:

#!/bin/bash
# usage: unbuffer-stdout.sh PID

gdb --pid "$1" -ex "call setvbuf(stdout, 0, 2, 0)" --batch

然后,我们可以这样称呼:

$ ./unbuffer-stdout.sh "$(pgrep -f my-program-name)"

(您可能需要sudo将其作为root.)

测试

我们可以用这个简单的Python程序与缓冲标准输出(如果不叫-u,并与未设置PYTHONUNBUFFERED)writer.py:

#!/usr/bin/python
import sys, time

while True:
    sys.stdout.write("output")
    time.sleep(0.5)

运行它:

$ ./writer.py >/tmp/output &
$ tailf /tmp/output

并且在我们运行之前观察没有输出:

$ sudo ./unbuffer-stdout.sh "$(pgrep -f writer.py)"


推荐阅读
  • 主调|大侠_重温C++ ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 本文详细介绍了C语言中的基本数据类型,包括整型、浮点型、字符型及其各自的子类型,并探讨了这些类型在不同编译环境下的表现。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • 深入解析Android中的SQLite数据库使用
    本文详细介绍了如何在Android应用中使用SQLite数据库进行数据存储。通过自定义类继承SQLiteOpenHelper,实现数据库的创建与版本管理,并提供了具体的学生信息管理示例代码。 ... [详细]
  • 本文介绍了如何在Mac操作系统中实现对NTFS文件系统的完整读写功能,包括必要的软件安装步骤和配置方法。 ... [详细]
  • 本文档详细介绍了在 Kubernetes 集群中部署 ETCD 数据库的过程,包括实验环境的准备、ETCD 证书的生成及配置、以及集群的启动与健康检查等关键步骤。 ... [详细]
  • Python 中使用 Pyecharts 绘制雷达图详解
    本文将详细介绍如何在 Python 环境中利用 Pyecharts 库来创建美观且功能丰富的雷达图。适合需要图形化展示多维度数据的开发者和研究人员。 ... [详细]
  • 本文探讨了如何使用ls -lsh命令排除总大小输出,仅显示文件大小的方法,并提供了几种实现这一目标的解决方案。 ... [详细]
  • 本文介绍如何在Ubuntu操作系统中为DELL Latitude系列笔记本配置触摸板的自定义快捷键。此方法不仅适用于DELL品牌,其他品牌的笔记本也可能适用。通过编写简单的脚本,用户可以实现触摸板的快速开关。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • Python + Pytest 接口自动化测试中 Token 关联登录的实现方法
    本文将深入探讨 Python 和 Pytest 在接口自动化测试中如何实现 Token 关联登录,内容详尽、逻辑清晰,旨在帮助读者掌握这一关键技能。 ... [详细]
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • 本文探讨了符号三角形问题,该问题涉及由相同数量的“+”和“-”符号组成的三角形。通过递归回溯法,可以有效地搜索并计算符合条件的符号三角形的数量。 ... [详细]
author-avatar
秋荼凝脂_697
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有