Aktyn l33t
Joined: 25 Dec 2005 Posts: 619
|
Posted: Fri Jun 05, 2009 9:15 pm Post subject: dwie kwestie z buforowaniem fork i atom. |
|
|
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 |
|