proba.c, malloc(), memset(), "Killed" ...

23 отговора 711 прегледа
в отговор на l #21

ето 2 варианта (2.6.7):

null:


int main() {
while (1) {
//void *p = malloc(10 * 1024 * 1024);
//void *p = malloc(13 * 1024);
void *p = malloc(12 * 1024);
if (!p) {
fprintf(stdout, "null\n");
//fprintf(stderr, "null\n");
return 0;
}
printf(".");
fflush(stdout);
//memset(p, 0, 10 * 1024 * 1024);
}
}

--------------


Segmentation fault:


int main() {
while (1) {
//void *p = malloc(10 * 1024 * 1024);
//void *p = malloc(13 * 1024);
void *p = malloc(12 * 1024);
if (!p) {
//fprintf(stdout, "null\n");
fprintf(stderr, "null\n");
return 0;
}
printf(".");
fflush(stdout);
//memset(p, 0, 10 * 1024 * 1024);
}
}

--------------


разликата между двата варианта е само в печата: към stdout или към stderr.

ако вдигна размера на блоковете памет от 12*1024 на 13*1024 също не ми гърми със segm. fault, а успешно принтва нулл.

....

Satan`s Defloration Incorporated
Отговор
в отговор на salle #22

Re: проблем 2 сякаш изчезна, но Killed си е Killed

прав си. не съм си го превел правилно този текст. не пише, че няма да убие ако опцията не е избрана.

Satan`s Defloration Incorporated
Отговор
в отговор на ЛУД ПPЪЧ #23

Re: ето 2 варианта (2.6.7):

Мдаа, явно има нещо бъгаво в цялата работа. Ако блоковете памет са малки (12К, 13К все тая) си гърми всеки път с "killed" :) На всичкото отгоре успява да убие и още някой друг беззащитен процес :)

Тъй като гледам с gdb, вероятно някой друг в libc не проверява дали malloc връща 0. За което никак не ги обвинявам. Overcommit memory е много удобно оправдание защо не трябва да се пишат такива проверки и аз веднага го включвам в употреба :)

Отговор
в отговор на mn_t #24

Re: проблем 2 сякаш изчезна, но Killed си е Killed

При мен на 2.4.26 и
# cat /proc/sys/vm/overcommit_memory
0
#

отпечатва null

Отговор