【问题标题】:sync two processes at some system call在某个系统调用中同步两个进程
【发布时间】:2013-03-09 23:02:43
【问题描述】:

是否可以在不修改代码的情况下在某些系统调用处同步两个 linux 进程?

一个真实的例子:v4l2-ctl 是一个工具,可用于设置网络摄像头的某些控件。运行它设置一些控件后,ffmpeg 用于用相机捕捉电影。但是,仅设置自己的一些控件并重置其他一些控件,ffmpeg 破坏了v4l2-ctl 所做的仔细调整。

现在,无需修改和重建其中一个或两个工具即可解决此问题。如果可以启动ffmpeg,这将是可能的,但在打开并配置/dev/video0(很可能发生一些ioctls)后将被暂停,然后将调用v4l2-ctl 以应用设置。之后,ffmpeg 将恢复并使用正确的设置开始捕获。

这是否可以跟踪一个进程的 io 操作并通过简单的方式将其挂起?

【问题讨论】:

    标签: linux process system-calls


    【解决方案1】:

    如果您喜欢冒险并且不介意使用调试编译的ffmpeg 对性能造成的影响,您可以在gdb 下启动它,并在打开/dev/video0(或其他任何地方)后设置断点。无论哪种方式,您都需要源代码。)

    然后您可以运行二进制文件直到它到达断点,调整v4l2-ctl,然后告诉ffmpeg 继续通过断点。

    【讨论】:

    • 这将有利于澄清暂停发生的位置。但是,我认为发布的一些ioctls 提供了足够的概述,可以进行清晰的切割。所以我想知道是否有任何方法可以拦截或停止看似合理的 io 操作,而不是分析大量代码。
    • 问题在于,即使您可以观察到这样的事件(例如,使用strace),您也无法及时做出反应(例如,通过发送SIGSTOP): ffmpeg 将在活动结束后继续运行,直到它例如处理了信号。
    • strace 看起来很酷。也许strace 拦截呼叫的方式可以用来阻止呼叫本身?如果存在这样的工具,它可以执行系统调用但保持控制,然后暂停进程,调用用户命令,并恢复进程。当以这种方式应用新设置时,该进程将停留在截获的ioctl
    • 这就像gdb 的便捷版本,它在ioctl 本身中放置一个条件断点,如果命中则运行用户命令。任何进程都可以通过这种方式被拦截,而无需对应用程序本身进行调试构建。也许该工具必须调整加载的共享库以进行可中断的ioctl 调用。
    • 这对于应用程序测试也很酷,例如。在应用程序内部的每个可能访问之间测试外部修改文件。
    猜你喜欢
    • 2011-04-19
    • 2017-11-30
    • 2018-08-18
    • 1970-01-01
    • 2014-12-13
    • 2015-07-30
    • 2017-02-21
    • 2023-04-07
    • 2020-09-10
    相关资源
    最近更新 更多