2013-03-09 60 views
0

是否可以在某些系統調用中同步兩個linux進程而不修改其代碼?在某些系統調用中同步兩個進程

一個真實世界的例子:v4l2-ctl是一個可以用來設置網絡攝像頭的某些控件的工具。運行它以設置一些控件後,ffmpeg用於使用相機捕捉電影。但是,僅設置一些控件並重置其他控件,ffmpeg將廢棄v4l2-ctl所做的精心調整。

現在,如果不修改和重建這兩個工具中的一個或兩個,就可以解決此問題。如果ffmpeg可以啓動,但是會在打開並配置/dev/video0(最有可能發生一些ioctls)和v4l2-ctl然後應用設置後暫停。之後,ffmpeg將會恢復,並開始使用適當的設置進行捕捉。

是否有可能通過簡單的方式跟蹤一個進程io操作並暫停它?

回答

1

如果你喜歡冒險的感覺,而且不介意使用調試編譯ffmpeg,你可以想見,啓動它gdb下,打開/dev/video0(後設置一個斷點或其他地方的性能損失。你需要的以任何方式來源)。

然後,您可以運行二進制文件,直到它遇到斷點,調整v4l2-ctl,然後告訴ffmpeg繼續經過斷點。

+0

這將有利於澄清暫停發生的位置。但是,我認爲幾個發佈的「ioctls」能夠提供足夠的概覽來完成清理工作。所以我想知道是否有任何方法可以攔截或停止合理的io操作,而不是分析龐大的代碼。 – dronus 2013-03-09 23:50:09

+0

問題是,即使你可以觀察到這樣一個事件(比如用'strace'),那麼你就無法及時地(通過發送一個'SIGSTOP')發出反應:'ffmpeg'會保持正確在事件之後運行,直到它例如處理信號。 – phs 2013-03-09 23:52:43

+0

'strace'看起來很酷。也許'strace'攔截呼叫的方式可以用來阻止呼叫本身?如果存在這樣的工具,它可以執行系統調用,但保持控制,然後掛起進程,調用用戶命令並恢復進程。該過程將卡住截取的'ioctl',而新的設置以這種方式應用。 – dronus 2013-03-10 00:10:46