2015-07-07 3 views
0

программы:команда Strace в Unix

#include<stdio.h> 
#include<sys/types.h> 
#include<malloc.h> 
main() 
{ 
    int *i1, *i2; 
    printf("sbrk(0) before malloc(): %x\n", sbrk(0)); 
    i1 = (int *) malloc(sizeof(int)); 
    printf("sbrk(0) after `i1 = (int *) malloc(4)': %x\n", sbrk(0)); 
    i2 = (int *) malloc(sizeof(int)); 
    printf("sbrk(0) after `i2 = (int *) malloc(4)': %x\n", sbrk(0)); 
} 

Выход 1:

[email protected]:~/Development/chap8$ strace -e sbrk ./a.out 
strace: invalid system call `sbrk' 
[email protected]:~/Development/chap8$ 

Выход 2:

[email protected]:~/Development/chap8$ strace -e brk ./a.out 
brk(0)         = 0x8380000 
brk(0)         = 0x8380000 
sbrk(0) before malloc(4): 8380000 
brk(0x83a1000)       = 0x83a1000 
sbrk(0) after `i1 = (int *) malloc(4)': 83a1000 
sbrk(0) after `i2 = (int *) malloc(4)': 83a1000 
[email protected]:~/Development/chap8$ 

Сомнения:

Функция Malloc выделяет память в куче, используя системный вызов sbrk. Здесь также прерывается программа после вызова malloc.

Но на выходе отображается только системный вызов brk. Команда strace выдает ошибку, поскольку «sbrk - это неверный системный вызов». Затем, как память
выделено с использованием malloc?

Но после вызова инструкции malloc на выходе отображается следующая строка «brk (0x83a1000)». Здесь, почему значение brk изменяется и почему sbrk не печатается на выходе?

+1

offtopic: используйте 'int main (void)' и 'return 0;' –

+0

Большинство 'malloc' используют' mmap'. Рассмотрите 'sbrk' как устаревший syscall (например, потому что он является недружественным потоком). –

+1

Offtopic 2: Пожалуйста, [см. Почему не делать] (http://stackoverflow.com/q/605845/2173917) возвращаемое значение' malloc() 'и семью в' C'. –

ответ

0

Думаю, куча создается только после первого вызова malloc(). До тех пор нам не нужна куча. Вот почему после первого вызова malloc() вы видите вызов «brk (0x83a1000)».

+0

Я тоже думаю о том же , Но почему sbrk не называется – mrg

+0

Я пробовал ту же программу и команду на Ubuntu 14.04. Я не получил ошибку: «strace: недействительный системный вызов' sbrk » malloc() вызывает системный вызов brk(), а не sbrk(). И это делается при первом вызове malloc. Он выделяет блок памяти. malloc() снова вызывает brk() только тогда, когда этот блок переполняется или недостаточен для соответствия запрошенному размеру памяти. И sbrk() похож на обертку вокруг brk(). Надеюсь, ваше сомнение выяснено. –