brk(0)이 호출되는 이유는 무엇입니까?

brk(0)이 호출되는 이유는 무엇입니까?

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시스템 호출 위에 구현되어 잘못된 주소로 호출하면 단순히 현재 값이 반환됩니다.brkbrk

관련 정보