簡體   English   中英

sbrk()如何工作?

[英]How does sbrk() work?

我試圖了解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));
}

輸出:

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

為什么前兩個地址之間的差異為0xac7000-0xaa6000 = 21000,而不是10?

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)不會改變中斷,那么為什么我們在這里得到一個不同的值呢?

在兩個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

這次我們看到的增量為0xa,與您先前的sbrk(10)調用完全匹配。 顯然這次, printf不需要分配動態內存(或者,如果這樣做, malloc可以在第一個sbrk獲得的空間內完成所有操作,因此它不需要從OS上請求更多)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM