2017-01-28 13 views
1

sbrkの仕組みを理解しようとしています。sbrk()はどのように機能しますか?

int main() 
{ 
    printf("end of the break : %p\n", sbrk(0)); 
    printf("end of the break : %p\n", sbrk(10)); 
    printf("new end of the break : %p\n\n", sbrk(0)); 
} 

この出力: - 0xaa6000 = 21000とない10

end of break : 0xaa6000  
end of break : 0xac7000  
new end of the break : 0xac700a  

なぜ最初の2つのアドレス 0xac7000間の差がある。ここ

は私の小さなコードのですか?

+0

https://en.wikipedia.org/wiki/Sbrk –

+1

[brk()システムコールは何をするのですか?](http://stackoverflow.com/questions/6988487/what-does-brk-システムコールド) –

+1

@ Meninx-メネンクスあなたのリンクにはこの質問に対する回答がありません。 – melpomene

答えて

6

sbrk(n)は、改行をnで増分し、古いの値を返します。

したがって:

printf("end of the break : %p\n", sbrk(0)); 

出力:end of the break : 0xaa6000

当初、ブレークは0xaa6000あるとsbrk呼び出しがそれを変更しません。

printf("end of the break : %p\n", sbrk(10)); 

出力:end of the break : 0xac7000

これはあなたがについて尋ねている値です。上記の私はsbrk(0)は休憩を変更しないと言ったので、なぜここで別の値を取得するのですか?

2つのsbrkコールの間に起こったのは、最初のprintfコールだけです。おそらく、stdio実装の内部はmalloc(たとえばバッファを作成する)を使用し、それ自体がsbrkを呼び出します。つまり、printfは内部でmallocを呼び出し、sbrkを使用してメモリを予約します。

printf("new end of the break : %p\n\n", sbrk(0)); 

出力:new end of the break : 0xac700a

今回、我々は正確にあなたの前のsbrk(10)コールに一致するは0xaの増分を、参照してください。明らかに今回はprintfは動的メモリを割り当てる必要はありませんでした。もしそうならば、mallocは最初のsbrkから得たスペース内のすべてを行うことができましたので、OSからさらに要求する必要はありませんでした。

+0

これはprintfのおかげです。 あなたの答えをありがとう! – Myranova

関連する問題