2012-02-22 2 views
0

straceA이라는 두 프로그램을 포크로하는 프로그램 BC에 대해 호출했습니다. strace에서strace의 Syscalls

, 나는 syscalls 다음 한 :

pipe[([3,4]) = 0 
pipe([5,6]) = 0 
fork(wc) = 7135 
fork (gnetcat) = 7136 
close(3) = 0 
close(5) = 0 
close(4) = 0 
close(6) = 0 
wait4(-1, NULL, 0, NULL) = 7136 
wait4(-1, NUKLL, 0, NULL) = 7135 

내가이 경우 C로 프로그램 A을 다시 작성하려고, 난 정말 정말 알고하지 않아도 무엇을 그 파일 기술자 3, 4, 56은 무엇입니까? 그들이 무엇인지 알아낼 수있는 방법이 있습니까? 나는 3stderr 인 것을 안다.

답변

0

0 ist STDIN, 1은 STDOUT이고 2는 STDERR입니다. 모든 높은 숫자는 응용 프로그램에 달려 있습니다. 이 경우 나는 그들이 갓 세운 프로그램의 stdout/stderr를 캡처하는 데 사용된다고 생각합니다. 이것은 "wc"가 stdout이 fd 3에 연결되고 stderr이 fd 4로 실행 됨으로써 주 응용 프로그램이 wc의 출력을 낼 수 있음을 의미합니다.

+0

왜 파일 기술자가 빈 파일을 다음 :

이 내가 progcess 예를 들어, 아이에서 표준 출력을 캡처하는 inorder를 파이프를 여는 경우 보여야하는데 무엇인가? 그들은 데이터를 파이프하는 데 어떻게 작용할 것입니까? C로 구현할 수 있으려면'4 '와 더 높은 모든 파일 기술자가 무슨 뜻인지는 중요하지 않겠습니까? 파이프에 넣을 수 있지, 그치? – darksky

+0

파일 설명자는 (열려있는) 파이프의 표현입니다. 글을 쓰고있는 곳을 확인할 수 있으려면 fd가 필요합니다. - strace에 read() 또는 write()가 없으므로이 파이프를 통해 전송되는 내용이 조금 이상하게 보입니다. - 그러나 "포크 (프로그램)"는 편집을 제안합니다 :-) – Sec

1

-f 플래그를 사용하여 strace를 다시 실행하여 포크를 따라 가야합니다. 현재 최상위 프로세스가하는 일만 볼 수 있으며 자녀 프로세스가 무엇을하는지 알 수 없습니다.

최상위 프로세스는 두 개의 파이프를 만듭니다. 파이프는 서로 통신하기 위해 프로그램에서 사용됩니다. 첫 번째 파이프에는 fd 3의 읽기 끝과 fd 4의 쓰기 끝이 있습니다. 두 번째 파이프는 fd 5의 읽기 끝과 fd 6의 쓰기 끝을 갖습니다.

최상위 프로그램은 네 개의 fds 두 개의 자식 프로그램을 호출 한 후에는 자식 프로그램에서 내부적으로 사용하는 것처럼 보입니다 (둘 다 fds 사본을 얻습니다). 이것은 일반적으로 부모 프로세스가 자식과 의사 소통하기 위해 열거 된 부모 프로세스를 계속 볼 것으로 예상하기 때문에 비정상적입니다. 귀하의 흔적이 각 포크 후에 fds에 일어난 일에 대한 중요한 정보를 놓치고있는 것처럼 보입니다.

parent_pid: pipe[3,4] 
parent_pid: clone() = child_pid 
parent_pid: close(4) 
child_pid: dup(4,1) 
child_pid: close(4) 
child_pid: close(3) 
child_pid: execve(some program) 
child_pid: write(1) 
parent_pid: read(3) 
parent_pid: wait(child_pid) 
child_pid: exit() 
관련 문제