쉘에 'ls'와 같은 명령을 입력 할 때마다 내 쉘인 부모 프로세스는 fork () 시스템 호출을 사용하여 복제 한 다음 exec () 시스템 호출을 사용하여 새 프로세스로 대체합니다. 이 경우 'ls'가 종료되면 컨트롤이 내 셸로 다시 전달됩니다.
그러나 'ls'에서 strace를 실행했을 때 execve () 호출 만 표시되고 포크는 표시되지 않으며 컨트롤은 여전히 내 셸로 다시 전달됩니다. 여기 좀 혼란스러워 ...
$ strace ls
execve("/usr/bin/ls", ["ls"], 0x7ffd938934e0 /* 25 vars */) = 0
brk(NULL) = 0x1134000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6ea9e38000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=23255, ...}) = 0
이해가 정확합니다. 달릴 때 strace ls
두 개의 포크도 있습니다. 쉘은 스스로 포크 exec()
하고 실행하는 데 사용 strace
하고 strace는 실행하는 데 동일한 작업을 수행 ls
합니다.
strace는 strace의 자식 프로세스 에서 시작된 모든 시스템 호출을 인쇄하기 때문에 strace 출력에서 포크를 볼 수 없습니다 .
bash
포크와 런 strace
strace
포크
부모 strace
는 자식 프로세스에 연결하여 모든 시스템 호출을 가로 챕니다.
이 시점부터는 시스템 호출 만 볼 수 있습니다.
자식 strace
실행 ls
사용execve()
포크가 발생하는 것을 확인하는 한 가지 방법은 strace
"외부에서" 부착 하는 것입니다.
echo $$
셸의 프로세스 ID를 가져 오는 데 사용 합니다.strace -f --attach=PID
에서 위의 프로세스 ID로 대체 된 'PID'로 실행 합니다.ls
첫 번째 셸에서 실행fork()
/ clone()
호출 포함)을 볼 수 있습니다.언급해야 할 다른 한 가지는 fork()
현재 Linux 커널에서 clone()
시스템 호출을 사용하여 구현 되므로 strace 출력 clone(…)
대신에 볼 수 있습니다 fork()
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다