2011-05-13 1 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-cp 대신)? –

답변

1

setsockopt에 대한 모든 호출을 가로 채고 일부 매개 변수를 변경할 수있는 래퍼 라이브러리를 만들 수 있습니다. 이것은 응용 프로그램이 setsockopt를 호출 할 때 작동합니다. 다른 경우에는 다른 기능을 포함 할 수 있습니다. socket도 동일한 접근 방식을 사용합니다. socket 래퍼에서 __socket을 사용하여 소켓을 만든 다음 원하는 매개 변수를 변경해야합니다.

래퍼 라이브러리는 setsockopt 기능이있는 동적 인 라이브러리 여야합니다. 이 함수는 glibc에 의해 오버로드 될 수있다. 그런 다음, 다음과 같이 programm에 시작 : programm에로

라이브러리가 주입됩니다
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 –

관련 문제