2011-05-13 62 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

相关问题