是否可以从命令行中设置setsockopt()

时间:2011-05-13 02:15:28

标签: linux sockets filesystems

我需要将程序应用程序的sk_rcvlowat更改为性能测试。有没有办法从命令行更改套接字选项?否则,我们必须更改应用程序的所有源代码并重新编译它们。我想每个套接字都与inode相关联,因此我们可以通过inode更改套接字选项。

顺便说一句,任何人都可以告诉我进程创建它时“套接字文件”所在的位置。我已经检查了/proc/<pid>/fd/<fd[X]>,但它们只是像10 -> socket:[13895]

这样的符号链接

任何建议都表示赞赏。提前致谢。

1 个答案:

答案 0 :(得分:1)

您可以创建一个包装器库,它将拦截对setsockopt的所有调用,并且可以更改某些参数。如果您的应用程序调用setsockopt,则此方法有效。在另一种情况下,您可以包装不同的功能,例如socket使用相同的方法。在socket的包装器中,您需要使用__socket创建一个套接字,然后更改所需的任何参数。

包装库必须是动态库,具有setsockopt功能。 glibc允许此函数重载。然后,按如下方式启动您的程序:

 LD_PRELOAD=path_to_wrapper_library/libwrap.so ./you_program

库将被注入(链接)到programm中,并将替换setsockopt函数。

这仅适用于动态链接的程序(使用ldd ./you_program检查 - 如果它是动态链接的,会有一些/lib/*.so。)

可以使用__前缀__setsockopt或使用dlsym(RTLD_NEXT, "setsockopt");从您的代码中调用原始函数。

一些示例(不是setsockopt,而是preload wrapper的想法):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