tail
첫 번째 셸에서는 인수 없이 명령을 실행합니다.
두 번째 셸에서는 strace를 사용하여 첫 번째 tail을 종료하여 시스템 호출을 모니터링합니다.
qdii@nomada ~ $ strace kill 1713
execve("/bin/kill", ["kill", "1713"], [/* 82 vars */]) = 0
brk(0) = 0x2533000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9dacfe8000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
이 명령어에 대해 몰랐는데 brk
, 찾아보니 프로세스 데이터 세그먼트의 끝 부분이 바뀌는 것을 발견했습니다. 왜 kill
이런 일을 하는가? 특히 데이터 세그먼트를 설정하는 것은 0
거의 의미가 없는 것 같습니다.
답변1
런타임 라이브러리 호출은 sbrk
데이터 세그먼트의 현재 끝을 읽습니다. 보시다시피 sbrk
시스템 호출 위에 구현되어 잘못된 주소로 호출하면 단순히 현재 값이 반환됩니다.brk
brk