Re: lug-bg: Задачка Закачка: Bash
- Subject: Re: lug-bg: Задачка Закачка: Bash
- From: Aleksandar Valchev <hippo@xxxxxxxxxxxxxxxxxx>
- Date: Tue, 30 Nov 2004 12:49:33 +0200
- Organization: Efficient Software Systems
On Tuesday 30 November 2004 12:22, Vasil Kolev wrote:
> On вт, 2004-11-30 at 12:06 +0200, Aleksandar Valchev wrote:
> > Да, exec-а преебава простотията. Вместо exec сложих system(). Със
> > system() май върви по-добре, накара ме да си рестартирам PC-то (като се
> > има на предвид, че няма никакви limits). Мисля си, че е по-добре да се
> > ловят сигналите SIGKILL, SIGSTOP (да не може да се спре изпулнението,
> > чрез kill), но чрез системното извикване signal(), не става. В ман page
> > на signal() пише, че може да игнорираш или да хванеш всички сигнал
> > изключение на SIGKILL и SIGSTOP, като същото се отнася и за sigaction
> > (евала на Linux :) ).
>
> Абе има си fork(), защо преоткриваш колелото...
:) При преоткриването на стари неща възникват нови, по добри идеи :), но все
пак признавам, че си прав.
>
> > Не мисля, че трябва нещо да пишеш в buffer-a за да зеeма памет. Би
> > трябвало malloc() да заделя памет и тя си остава заделена, без значение
> > дали си записал нещо в нея или не :). Якото е, че не се освобождава :).
>
> Хм, май трябва да видиш как работи ядрото. По принцип памет се заделя
> само логически, физически замаш страница в паметта чак като започнеш да
> пишеш в нея. Пробвай,пусни нещо да malloc-ва, и гледай резултата с top.
>
> Ето така изглежда една класическа fork() бомба:
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <unistd.h>
>
> int main()
> {
> char *fillbuff;
>
> while (42)
> {
> fork();
> fillbuff=malloc(4096);
> *fillbuff='A';
> }
> return 0;/* never reached */
> }
No Comment 5 :). Аз го писах това за malloc изхождайки от познанията си за
C-то, които са общи и не предвидих, какво прави кернела. Отново си прав.
>
> Вместо malloc може да се заделя shared memory, което е още по-страшно,
> понеже тя се освобождава доста по-трудно, и не мога да се сетя дали
> можеше и да се лимитира.
Само за информация. За да се задели shared memeory си използва shmget() (man 2
shmget), но при заделянето на shared memory се намесват вече и потребителски
разрешения.
За да се задели споделена памет:
shm_hash = shmget(IPC_PRIVATE, HASH_TABLE_SIZE, IPC_CREAT|0777);
Тази памет може да се използва само от процеса, който я е заделил и от
неговите дъщерни процеси, заради PCI_PRIVATE аргумента(поне така си
обяснявам :) ), което е добре в случая, но в други програми това е много
тъпо :).
============================================================================
A mail-list of Linux Users Group - Bulgaria (bulgarian linuxers).
http://www.linux-bulgaria.org - Hosted by Internet Group Ltd. - Stara Zagora
To unsubscribe: http://www.linux-bulgaria.org/public/mail_list.html
============================================================================
|