2013-04-04 27 views
2

我擁有的是進程ID和來自該進程的文件描述符。除了sendmsg之外,還有什麼辦法可以複製(或重新打開)該進程的文件描述符以供Linux中的其他進程使用?Linux中另一個進程的重複文件描述符(不帶sendmsg)

Windows爲此具有DuplicateHandle,我不知道Linux上是否有類似的東西。

+0

簡短而唯一的答案是:不可以。原因是文件描述符只是表中的索引,而且每個表每個進程都是唯一的,所以不能簡單地在另一個進程中使用一個描述符。 – 2013-04-04 11:04:53

+0

我已更新我的問題。我想在另一個進程中重新打開文件描述符。像這裏描述的東西[這裏](http://stackoverflow.com/questions/2358684/can-i-share-a-file-descriptor-to-another-process-on-linux-or-are-they-local到t)但沒有sendmsg – Sergey 2013-04-04 11:09:06

+1

答案仍然沒有。如果你想在另一個進程中複製句柄,你可以使用'sendmsg'方法。難道其他進程不能自己打開相同的文件,而不是試圖從第一個進程獲取描述符? – 2013-04-04 11:11:53

回答

1

如果您擁有適當的權限,則PID爲43512的進程的文件描述符5位於/proc/43512/fd/5。我從來沒有把這些事情搞得一團糟(除了偷看之外),所以在那裏寫作可能會工作得很好,或者舉行壯觀的焰火表演。

+0

你不能像這樣打開插座:/ – ysdx 2015-03-28 18:37:55

3

As + vonbrand指出你可以使用/proc/<pid>/fd/<fd>。但是你不能只是「寫在那裏」,它不會給任何冷杉。

這是一個特殊的符號鏈接,該文件與pid <pid>作爲文件描述符<fd>打開。

只需使用它在您的過程中打開完全相同的文件即可。

您不必擔心原始文件被刪除或替換,因爲使用此鏈接將始終爲您提供打開過程的原始文件。剛剛嘗試下面的小塊的bash代碼:

#!/bin/bash 
echo "test" >/tmp/file 
ls -li /tmp/file 
exec 3<> /tmp/file 
rm /tmp/file 
ls -lLi /proc/$$/fd/3 
cat /proc/$$/fd/3 

這將創建一個包含字符串測試文件/tmp/file。打開文件作爲文件描述符,刪除它,刪除後仍然可以通過/proc/self/fd/3cat其內容。在linux中,只要任何進程仍然使用它,文件就不會被最終刪除。

因此,不用獲取和使用進程的文件描述符,只需打開文件描述符「指向」即可。

當然,您需要這樣做的權利/權限/特權。如果您擁有這兩個進程或者您是root用戶,那麼您擁有哪一個。

編輯:如果不是在bash中,您也可以使用/proc/self/...而不是/proc/$$/...來獲取有關當前進程的信息。

+0

這看起來正是我所需要的。將嘗試一下。 – Sergey 2013-04-04 18:13:33

相關問題