2011-05-13 59 views
2

我需要將程序應用程序的sk_rcvlowat更改爲性能測試。有沒有辦法從命令行更改套接字選項?否則,我們必須更改應用程序的所有源代碼並重新編譯它們。我想每個套接字都與一個inode有關,所以我們可以通過inode更改套接字選項。是否有可能從命令行的setsockopt()

順便說一句,請任何人都可以告訴我,當進程創建它的位置「套接字文件」。我已經檢查過/proc/<pid>/fd/<fd[X]>,但它們只是像這樣的象徵性鏈接10 -> socket:[13895]

任何建議表示讚賞。提前致謝。

+0

也許雖然'的/ proc//FD/'看起來像一個符號鏈接,你可以實際上打開它作爲套接字,就像[刪除的文件](http://superuser.com/questions/246524/recover-open-but-deleted-file-on-linux-using- LN-INSTEAD-OF-CP)? – 2013-10-22 22:33:15

回答

1

您可以創建一個包裝庫,它將攔截所有對setsockopt的調用,並且可以更改一些參數。如果您的應用程序有對setsockopt的調用,這將起作用。在另一種情況下,你可以包裝不同的功能,例如socket使用相同的方法。在socket的包裝中,您需要使用__socket創建一個套接字,然後更改所需的任何參數。

包裝庫必須是動態的,具有setsockopt功能。這個函數可以被glibc重載。然後,啓動你的程序如下:

LD_PRELOAD=path_to_wrapper_library/libwrap.so ./you_program 

該庫將被注入(鏈接)到程序並將取代setsockopt函數。

這隻適用於動態鏈接的程序(與ldd ./you_program一起檢查 - 如果它是動態鏈接的,將會有一些/lib/*.so)。

原始功能可以從您的代碼中調用__前綴:__setsockopt或使用dlsym(RTLD_NEXT, "setsockopt");

一些例子(不是setsockopt的,但預緊包裝的想法):http://scaryreasoner.wordpress.com/2007/11/17/using-ld_preload-libraries-and-glibc-backtrace-function-for-debugging/http://developers.sun.com/solaris/articles/lib_interposers_code.html

編譯動態庫:

gcc wrap.c -fPIC -shared -ldl -o libwrap.so 
+1

非常感謝Osgx。你的想法非常好,在盒子外面思考。我會嘗試使用這個技巧:D – 2011-05-13 14:44:27

相關問題