Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Nesto bolje od atexit()

[es] :: C/C++ programiranje :: Nesto bolje od atexit()

[ Pregleda: 2433 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.sbb.rs.



+2789 Profil

icon Nesto bolje od atexit()26.12.2008. u 09:24 - pre 186 meseci
Da li je moguce osigurati pozivanje neke funkcije cak i onda kada program pukne (delenje nulom, segmentni prekrsaj,...)? Funkcijom atexit() se zadaje lista funkcija koje ce se pozvati nakon regularnog zavrsetka radaprograma, ali meni ne treba to.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.tekostolac.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Nesto bolje od atexit()26.12.2008. u 10:47 - pre 186 meseci
Nedeljko, šta konkretno želiš da postigneš tim mehanizmom?

Kada je u pitanju deljenje nulom, tu obično nema većih problema, pogotovo jer se može i 'maskirati'. Najobičniji RAII će ti završiti posao, ali to sigurno već znaš. Ovde ima i jedan mali primer, upakovan u template.

Dalje, u nekim okruženjima, inicijalizacija celog frameworka je unutar ugnjezdenih try/catch mehanizama, pa možda da pokušaš i sa time. Naravno, sve zavisi od konkretnog zahteva.

Konačno, za ozbiljnije stvari podigneš neki 'watchdog' servis.
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.fibertel.com.ar.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Nesto bolje od atexit()26.12.2008. u 10:48 - pre 186 meseci
Odgovor na ovo pitanje zavisi od operativnog sistema koji koristis. Ako se radi o windowsu onda treba da proucis SEH (Structured exception handling), ako se pak radi o POSIX operativnom sistemu onda se za to koriste signali.

SEH
http://msdn.microsoft.com/en-us/library/ms680657(VS.85).aspx

Samo da napomenem da nije dozvoljeno mesanje klasicnog c++ i SEH exception koda nesto tipa ovoga:

Code:

DWORD FilterFunction() 

    printf("1 ");                     // printed first 
    return EXCEPTION_EXECUTE_HANDLER; 

 
VOID main(VOID) 

    std::auto_ptr<int> p(new int);
    __try 
    { 
        __try 
        { 
            p; // nedozvoljeno
            RaiseException(1,         // exception code 
                0,                    // continuable exception 
                0, NULL);             // no arguments 
        } 
        __finally 
        { 
            printf("2 ");             // this is printed second 
        } 
    } 
    __except ( FilterFunction() ) 
    { 
        printf("3\n");                // this is printed last 
    } 
}



Tko leti vrijedi
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.sbb.rs.



+2789 Profil

icon Re: Nesto bolje od atexit()26.12.2008. u 12:39 - pre 186 meseci
Citat:
kiklop74: Odgovor na ovo pitanje zavisi od operativnog sistema koji koristis. Ako se radi o windowsu onda treba da proucis SEH (Structured exception handling), ako se pak radi o POSIX operativnom sistemu onda se za to koriste signali.


Zar Windows nije 100% POSIX OS, kako Ivan Dimkovic mnogo puta rece?

OK. Kombinacije su sledece: Linux + g++, MSW + MinGW. Ako bi jos moglo i pod MacOS X + g++, onda do yaya.

Citat:
X Files: Nedeljko, šta konkretno želiš da postigneš tim mehanizmom?


Da osiguram npr. da ce log fajl ofstreamovi biti ispraznjeni (flush) i eventualno jos neke stvari da ce se uraditi, sta god se desilo sa programom. Ako pokrijem jednu klasu tipova pucanja, to je vec nesto, ali ako znam da nikakva pucanja ne mogu da zeznu praznjenje bafera i druge zeljene zavrsne akcije, onda do yaya.

Citat:
X Files: Konačno, za ozbiljnije stvari podigneš neki 'watchdog' servis.


Koji je zaseban proces kome saljem poruke sta treba da se loguje, pa ako puknem ja, on nece, pa ce njegovi baferi biti propisno ispraznjeni. Sta preporucujes za brzu komunikaciju izmedju procesa (nikakvo XML-oavnje i ni bajt preko diska)?
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.tekostolac.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Nesto bolje od atexit()26.12.2008. u 13:15 - pre 186 meseci
Citat:

Da osiguram npr. da ce log fajl ofstreamovi biti ispraznjeni (flush)

Imao sam jednom slicnu dilemu i problem, barem mi se cini prema tvom opisu.
Razvijao sam sistem za obavestavanje (email, sms, posebne lan poruke) o alarmnim signalima rada termoblokova u realnom vremenu . E sad, 'glavni' program (i on je bio servis) je u realnom vremenu i u realnim situacijama proizvodio veliki broj 'informacija' koje je trebalo proslediti na sms, email i sl. Nekada stotine i hiljade na sat.

Taj program je sam po sebi bio osetljiv (jos je bio u razvoju) i nikako nisam smeo buffer NEOBRADJENIH (neposlatih) poruka funkcionalno u celosti prepustiti njemu samom. Upravo zbog potencijalnog pucanja, a naravno i zbog pametnijeg dizajna.

Na primer, pucanje i restart programa (u nekom RANDOM trenutku) se moglo manifestovati ponovnim slanjem vec poslatih SMS-ova ili jos gore ne-slanjem onoga sto je moralo biti poslato.

Citat:

Sta preporucujes za brzu komunikaciju izmedju procesa (nikakvo XML-oavnje i ni bajt preko diska)?

Onda sam prosto napravio tri zasebna servisa SMSServer, LANServer i EMAILServer kojima sam sto je pre bilo moguce prosledjivao sadrzaj onoga sto je bilo za slanje, a ti veliki bufferi su bili sada u njihovoj nadleznosti. Ti programi (servisi) su sami po sebi bili dosta jednostavni, a time i pouzdani.

Slanje sam realizovao 'obicnim' TCP/IP socket-ima, sto je ekstra brzo.

Mogu se za komunikaciju koristi jos brojne stvari tipa "Named pipes", i sl... mozda i Shared memory blokovi. Dakle, nema prethodnog upisa na disk.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.sbb.rs.



+2789 Profil

icon Re: Nesto bolje od atexit()26.12.2008. u 13:30 - pre 186 meseci
Citat:
X Files: E sad, 'glavni' program (i on je bio servis) je u realnom vremenu i u realnim situacijama proizvodio veliki broj 'informacija' koje je trebalo proslediti na sms, email i sl. Nekada stotine i hiljade na sat.


Nisam znao da slanje u proseku jedne poruke u sekundi moze biti tolika gnjavaza. No, dobro, kad ti kazes, tako je. U svakom slucaju, hvala.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
200.49.157.*

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Nesto bolje od atexit()26.12.2008. u 14:04 - pre 186 meseci
Citat:
Nedeljko: Da osiguram npr. da ce log fajl ofstreamovi biti ispraznjeni (flush) i eventualno jos neke stvari da ce se uraditi, sta god se desilo sa programom. Ako pokrijem jednu klasu tipova pucanja, to je vec nesto, ali ako znam da nikakva pucanja ne mogu da zeznu praznjenje bafera i druge zeljene zavrsne akcije, onda do yaya.


Ok sada je jasnije. Ti treba da pokrijes dve situacije. Prva je hendlovanje bilo kog c++ exception-a. To se radi ovako:

Code:

#include <cstdlib>
#include <iostream>

int main(int argc, char* argv[])
{  
  int result = EXIT_FAILURE;    
  try {

        /* Ovde ide glavni kod */
       
        result = EXIT_SUCCESS;
    }
     catch (const std::exception& e) {
        std::cerr << "Neka greska je u pitanju" << std::endl;
        std::cerr << e.what() << std::endl;
    }
 
    return result;
}


Ovako se procesiraju svi exceptioni iz standardne biblioteke. Time je garantovan korektan RAII. Sledeci korak je stavljanje tvoje ofstream instance u neki RAII objekt npr: ovako:

Code:

struct my_ofstream {
  explicit my_ofstream(const char* fname) {
    ofs.open(fname);
  }
  ~my_ofstream() {
     ofs.flush();
  }
  
  std::ofstream ofs;
};


Koriscenjem ovakvog ofstreama uz dodatak za exceptione garantuje da ce pri bilo kojem c++ exceptionu objekat korektno da se zatvori.

Sto se tice signala tu je malo drugacija situacija. Signali si poruke operativnog sistema koje se salju programu u specificnim situacijama kao deljenje sa nulom ili zahtev korisnika za vanrednim zatvaranjem programa. Podrazumevano ponasanje je da se izvrsavanje programna prekine u slucaju netretiranog singala. Zato treba postaviti hendlere koji ce tretirati svaku od poruka na poseban nacin.

Ovo ti je literatura za pocetak a ostalo vidi sam.
http://en.wikipedia.org/wiki/Signal_(computing)
http://en.wikipedia.org/wiki/Signal.h



Tko leti vrijedi
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.microsoft.com.



+6 Profil

icon Re: Nesto bolje od atexit()26.12.2008. u 14:43 - pre 186 meseci
Takođe baci pogled na funkciju set_terminate()

Ona ti neće pomoći kod npr deljenja sa nulom, osim ako (Windows) ne podesiš da se SEH mapuje na C++ izuzetke. Kod (nekih) Unixa možeš da baciš izuzetak iz signal handlera pa si opet na istom.

Evo jedne diskusije sa rešenjima za obe platforme: http://gcc.gnu.org/ml/gcc/2004-09/msg00698.html
 
Odgovor na temu

[es] :: C/C++ programiranje :: Nesto bolje od atexit()

[ Pregleda: 2433 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.