簡體   English   中英

使用UNIX套接字將文件描述符從一個程序傳遞到同一主機上的另一個程序

[英]Passing file descriptor from one program to another on the same host using UNIX sockets

我有兩個prgrams讓我們說prog1和prog2。 我正在用prog1打開一個文件並對其進行一些操作。 現在沒有關閉prog1中的文件,我使用unix套接字將其文件描述符發送到prog2,然后在其中執行一些操作。

雖然我得到了相同的描述符,我在prog1中傳遞但是在prog2中收到的fd上執行fstat()會拋出錯誤,說錯誤的文件描述符。 我已經在prog1中打開了具有corerct權限的文件,這些權限對所有人都是讀寫的,但我仍然收到錯誤。

為什么會這樣。 如果我傳遞文件描述符的方式是錯誤的,那么請建議一個正確的方法。

我相信這個網站有你想要的東西:

http://www.lst.de/~okir/blackhats/node121.html

在Linux的man 7 unix中也有使用SCM_RIGHTS和Unix套接字的其他功能的信息。

修復損壞的鏈接: http//web.archive.org/web/20131016032959/http//www.lst.de/~okir/blackhats/node121.html

這很正常。 每個程序都有自己的文件描述符。

編輯 :好吧,似乎你可以使用本地套接字傳遞文件描述符。

您可以在/proc/PID/fd看到它們,它們通常是文件的符號鏈接。 你可以用unix socket做什么,允許用sendmsg / recvmsg從一個程序寫到另一個程序。 有關詳細信息,請參閱此問題

但是有很多更好的方法可以同時寫入文件。 您可以使用fifo,shm甚至只是在兩個程序之間傳遞偏移位置。

文件描述符是一個小的int值,可用於訪問文件。 它是文件描述符表的索引, 文件描述符表是內核中與每個單獨進程相關聯的數據結構。 進程無法對來自其他進程的文件描述符執行任何有意義的操作,因為它無權訪問任何其他進程的文件描述符表。

這是出於基本安全原因。 如果一個進程能夠對屬於另一個進程的打開文件執行操作,則會發生混亂。 此外,文件描述符不包含足夠的信息來執行您要執行的操作; 一個進程的文件描述符0(stdin)可能引用一個完全不同於另一個進程的文件描述符0的文件。即使它們碰巧是同一個文件,每個進程也需要維護自己的有關該文件的狀態信息(如何很多它的讀/寫等)。

如果你要描述你想要完成的事情,也許我們可以提供幫助。

編輯:

您希望將數據從一個程序傳遞到另一個程序。 最直接的方法是創建一個管道( man 2 pipe )。 請注意,第二個進程必須是第一個進程的子進程。

另一種方法是創建第二個進程可以打開和讀取的文件(不嘗試共享文件描述符),也可以使用套接字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM