Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
dwie kwestie z buforowaniem fork i atom.
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Polskie forum (Polish) Polish OTW
View previous topic :: View next topic  
Author Message
Aktyn
l33t
l33t


Joined: 25 Dec 2005
Posts: 619

PostPosted: Fri Jun 05, 2009 9:15 pm    Post subject: dwie kwestie z buforowaniem fork i atom. Reply with quote

Mam takie pytanie, ewentualnie gdzie szukać takich informacji. Typowo w manach się nie doszukałem. I czy to jest normalne?

Pewien programik którego usprawniam nagle zaczął sie zachowywać troche dziwnie, bo miałem duplikaty rzeczy pakowanych do pliku. W zasadzie zupełnie przypadkowych, co mnie zbiło z tropu. Szczególnie kiedy ujawniły się dopiero po większej ilości informacji. Troche uszeregowałem to, i okazało się że przyczyną było wywołanie fork() po fprintf( plik ).

Otoż intuicyjnie wszystko co przed fork powinno iść do plik, no i szło, ale okazało sie że deskryptor zduplikowany przez fork, był jeszcze na nie opróżniony bufor, w zależności co sobie tam nabadźgałem, dane były dość przypadkowe czasem, i nie dawało nic nawet zamknięcie deskryptora do pliku w potomku po fork(), bo program to co potem zrobił i tak szło podwójnie (ale tylko niektóre paczki), i co gorsza przypakowe dane, a nie w kolejności. A ponieważ jest to typowo nie widoczne i IMHO nie intuicyjne, czy wywołanie fork() nie powinno załatawić tego ?

I drugie pytanie, czemu te dane były poszatkowane, gdzieś czytałem że do operacji na danych strumieniach jest zapewniona operacja atomowa, da linuksa jest to chyba 1024 albo 4096. Rozumiem to tak (może źle) że operacja jendorazowo printf(plik, "te dane mają być nie poszatkowane") będzie w całości, a tutuj te dodatkowe wpisy, miałem byle gdzie. I sie tak zastanwiam czy ta operacja atomowa ma znaczenia dla pojedynczej, czy także dla mniejszej od np 1024, czy dla pakietów po 1024. (zapis bufora co 1024) Wtedy rzeczywiście może sie tak dziać. Czy może ta operacja atomowa nie dotyczy deskryptorów do pliku a jedynie do tych tworzonych przez pipe() ?

A może to ma inną przyczyne?

tak w zarysie to wyglada:
Code:
fprintf (floglast, "ble ble kture ma byc nie poszatkowane\n" );

/* tutaj coś jeszcze robimy */

/* no i fork */
fork()

/* po sprawdzeniu czy fork sie udał */

/* potomek zamyka i nic tu nie robi */
fclose(floglast);

/* rodzic zapisuje */
fprintf (floglast, "jakies ine komnuikaty mają być nie poszatkowane\n" );


wynik:
Code:
ble ble kture ma byc nie poszatkowane
jakies ine komnuikatyble ble kture ma byc nie poszatkowane
 mają być nie poszatkowane

_________________
Aktyn Pages
są ludzie inteligentni, są nad wyraz inteligentni i błyskotliwi, są jasnowidze, są wszechwiedzący bogowie, oraz ludzie piszący kompilatory
Back to top
View user's profile Send private message
lazy_bum
l33t
l33t


Joined: 16 Feb 2005
Posts: 691

PostPosted: Sat Jun 06, 2009 10:24 am    Post subject: Reply with quote

[ot] s/kture/które/ [/ot]
_________________
roslin uberlay | grubelek
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Polskie forum (Polish) Polish OTW All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum