C---atexit()

0

mam taki problem

main sie wykonuje......i ustawiam fjcę zeby sie wykonywala przy wyjsciu via atexit()
forkuje sie i proces potomny dziedziczy te ustawiona fcje i jak wychodze z niego (procesu potomnego ) to caly program sie sypie ......
da sie anulowac zarejestrowana przez atexit() fcje???
z gory txh :d

0

Może daj parametr dla swojego programu i zależnie od jego wartości będzie rejestrował funkcję atexit() albo nie - wtedy kiedy trzeba.

0

hmm tylko motyw jest taki ze pewien zestaw fcji musi byc wykonywany na koncu...a kiedy ten koniec bedzie to trudno przewidziec bo mam conajmniej 20 fcji ktore moga zwrocic blad i trzeba wyjsc z programu wykonujac ta fcje...wiec musze atexit() wywolac na poczatku programu...... :/

0

Ponieważ nie wiem co Twój program robi ani jak jest napisany to mogę tylko sugerować sprawdzenie czy jest dobrze zaprojektowany, być może to Twój błąd w programie powoduje takie zachowanie... np. przy wyjściu zwalniasz pamięć, która jest później użyta przez proces rodzica [to tylko domysły] lub coś podobnego (uchwyty plików, itd.)

0

tworze kolejki komunikatow ,pamiec wspoldz. i semafory...no i wrzycilem usuwanie tego wszystkiego do jednej fcji.....( no chyba nie powiesz ze to zly pomysl ) :>:d .....
kiedy powinno byc to usuniete tego nie mozna przewidziec ale na pewno tego nie powinien robic proces potomny........zamiast tego moglbym w kazdym miejscu gdize jest "return " umieszczac wywolanie tej fcji ale to nie o to chodzi :/ kod sie zasmieca....

0

tworze kolejki komunikatow ,pamiec wspoldz. i semafory...no i wrzycilem usuwanie tego wszystkiego do jednej fcji.....( no chyba nie powiesz ze to zly pomysl ) :>:d .....
kiedy powinno byc to usuniete tego nie mozna przewidziec ale na pewno tego nie powinien robic proces potomny........zamiast tego moglbym w kazdym miejscu gdize jest "return " umieszczac wywolanie tej fcji ale to nie o to chodzi :/ kod sie zasmieca....

No to mamy odpowiedź dlaczego się sypie :>
Powiadom proces potomny, żeby nie czyścił tego, co jest potrzebne w procesie rodzicu. Chyba najlepiej rozdzielić rzeczy, które może wykonać tylko rodzic (zwalnia współdzieloną pamięc, zamyka uchwyty) i rzeczy który wykonać mogą oba procesy (zwalniać pamięć prywatną/nie-współdzieloną) i niech rejestracja tych dwóch oddzielnych części przez atexit() będzie zależna czy proces jest rodzicem czy dzieckiem.
Anyway, powodzenia.

0

no spox ......chyba mnie nie zrozumiales ( bez obrazy :> )
.....jesli zarejestruje fcje atexitem to przeciez jak wychodze z potomka returnem albo exitem to ta fcja jest automatycznie wykonywana ( bo te ustawienia zostaly odziedziczone) ....i motyw polega na tym ze chcialbym anulowac ta fcje w procesie potomnym :>

0

Z tym fork() to fakt :) za dużo Windows...
Pomyśl nad rozdzieleniem tych funkcji i jakąś flagą (wewnątrz funkcji), która będzie kontrolować czy ją wykonać czy nie... To jest kwestia odpowiedniego zaprojektowania programu (chyba? :) ).

0

pewnie masz racje ..... :d ...ucze sie dopiero ;P

0

Stworz sobie gdzies tam globalną blokade ,np.:

unsigned watki=0;

Pzy tworzeniu kazdego watku wykonuj

watki++;

A przy konczeniu (przy wywolaniu atexit):

If(!(watki--)){
// wrzuc tu kod przeznaczony do wykonania przy wyjsciu z programu
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1