我需要将程序应用程序的sk_rcvlowat
更改为性能测试。有没有办法从命令行更改套接字选项?否则,我们必须更改应用程序的所有源代码并重新编译它们。我猜每个套接字都与一个inode
相关联,因此我们可以通过inode
更改套接字选项。
顺便说一下,任何人都可以告诉我“socket文件”在进程创建时位于何处。我已经检查过了/proc/<pid>/fd/<fd[X]>
,但它们只是象这样的符号链接10 -> socket:[13895]
如有任何建议,我们将不胜感激。提前谢谢。
最佳答案
您可以创建一个包装器库,它将拦截对setsockopt
的所有调用,并能够更改一些参数。如果应用程序调用setsockopt,则此操作有效。在另一种情况下,可以使用相同的方法包装不同的函数,例如socket
。在socket
的包装器中,您需要使用套接字创建一个套接字,然后更改所需的任何参数。
包装器库必须是动态的,具有setsockopt
函数。glibc允许重载此函数。然后,按如下方式启动程序:
LD_PRELOAD=path_to_wrapper_library/libwrap.so ./you_program
库将被注入(链接)到程序中,并替换setsockopt函数。
这只适用于动态链接的程序(使用
ldd ./you_program
-将有一些/lib/*.so如果它是动态链接的)。原始函数可以从前缀为
__
或使用__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