是否有可能以編程方式捕獲Linux上正在運行的進程的stdout(和stdin)? (也許重定向到管道?)以編程方式重定向正在運行的進程的stdout?
如果解決方案在用戶空間中工作(意思是不需要root權限)將是最好的。
我見過an answer apparently using gdb,但我想這樣做沒有gdb。
編輯:澄清:不,我沒有訪問代碼,我也不想更改二進制文件,我希望解決方案從單獨的進程中工作。無論如何,目標進程已經在運行。
是否有可能以編程方式捕獲Linux上正在運行的進程的stdout(和stdin)? (也許重定向到管道?)以編程方式重定向正在運行的進程的stdout?
如果解決方案在用戶空間中工作(意思是不需要root權限)將是最好的。
我見過an answer apparently using gdb,但我想這樣做沒有gdb。
編輯:澄清:不,我沒有訪問代碼,我也不想更改二進制文件,我希望解決方案從單獨的進程中工作。無論如何,目標進程已經在運行。
從過程本身內(假設你可以在C改變它的代碼),你可以嘗試freopen(3),也許
FILE*newout = freopen("/some/path", "w", stdout);
if (!newout) { perror("freopen"); exit (EXIT_FAILURE); }
stdout = newout;
參見stdio(3)。 (否則dup2
的STDOUT_FILENO
)。
從過程之外,你可能也許/proc/$PID/fd/
是dup2(2),或重定向,或tee(1),該/proc/$PID/fd/0
爲您處理$PID
的標準輸入打,/proc/$PID/fd/1
爲您的流程$PID
等的標準輸出有關更多信息,請參見proc(5)。
如果您已經開始此過程,則可以使用gdb
實際重定向stdout
或strace
以截獲對write
et.al.的調用。
如果您不想使用gdb
或strace
您可能需要基本上做同樣的事情。他們正在做的魔術是使用ptrace
函數來追蹤其他進程。這將要求您有權跟蹤程序(其中gdb
和strace
要求),作爲普通用戶,您無法跟蹤其他用戶的程序。
Linux Journal有一篇關於playing with ptrace的文章,它顯示了你如何做到這一點。有一點需要注意的是,這將取決於平臺:您必須專門爲您使用的平臺編寫代碼,文章似乎有(32位)x86平臺的示例。
您可能會在unix.stackexchange.com上得到更快更好的答案 –
您指出的問題是否包含使用'strace'的選項? – devnull
嗯......strace的建議看起來很有趣,儘管我強烈希望能夠實際上_redirect_輸出(如主題行中所述),以便原始目標斷開連接,並且IIUC strace允許我只是「竊聽」通訊。 (具體來說,我的首選解決方案似乎更通用,並允許strace-like作爲特例。) – akavel