我需要将程序应用程序的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

08-26 13:59