2011-07-28 2 views
0
  1. 외부 프로세스로 수행하는 방법은 무엇입니까? 예를 들어, 프로세스 A는 프로세스 B에서 어떤 시스템 호출을 알고 싶습니까? strace 같은 거?
  2. 프로세스 자체에서 호출 된 시스템 호출을 인쇄하는 방법은 무엇입니까? 이벤트 등록 같은 거요?

감사합니다!프로그래밍 방식으로 리눅스에서 실행중인 프로세스에서 호출 된 시스템 호출을 인터셉트하는 방법은 무엇입니까?

+1

http://stackoverflow.com/questions/5494316/how-does-strace-work – Nobody

+0

@ 아무도 처음에는 당신의 코멘트를 알지 못했습니다. –

답변

1
  1. ps 등으로 프로세스 ID를 확인하십시오. 그런 다음 "strace -p pidnumber"를 실행하십시오. 당신은 strace를 그것을 수행하는 방법을 확인할 수 있습니다

  2. 는 소스 코드를 사용할 수 있습니다, 또는 특정 시스템 호출에 대한 유일한 경우 당신은 (... 프로그램 내에서

+0

그러나 그렇게 할 수있는 프로그래밍 방법이 있습니까? 예를 들어, 호출 할 일부 함수, 처리 할 시스템 호출 트랩 이벤트가 있습니까? – flyingbin

+1

답변은 모두 strace 소스 코드에 있습니다. –

0

을 strace를하지 부를 수 all)을 사용하면 C 스텁 함수를 다시 작성하여 공유 라이브러리에 놓고 LD_PRELOAD를 설정하여 대상 응용 프로그램을 실행하기 전에 라이브러리를 미리로드 할 수 있습니다.

동적 링커가 함수 호출을 해결할 때 함수가 C 라이브러리에서 제공하는 함수보다 우선합니다.

이것은 동적으로 링크 된 응용 프로그램 (거의 모든 경우)에서만 작동하며 사용 된 C 라이브러리와 이진 호환이 필요합니다. 거의 모든 리눅스는 glibc를 사용하고 다른 glibc 버전은 바이너리와 호환되기 때문에 이것은 문제가되지 않습니다.

fakeroot (예를 들어)에서 수행 방법을 볼 수 있습니다.

추가 : 전체 시스템 호출 랩퍼를 다시 구현하는 대신 호출을 C 라이브러리의 실제 구현으로 전달할 수도 있습니다. 수동으로 라이브러리를로드하고 주소를 확인해야한다고 가정합니다 (확실하지는 않지만 직접 전화를하게됩니다).

관련 문제