Programistyczne mirki - ostatnie zadanie przed moim kolokwium :)
Tym razem... ...program coś nie chce działać :/ Pytanie brzmi: co pojawi się na wyjściu standardowym w wyniku wykonania poniższego programu?
Jedyne, czym raczy mnie Ubuntu to: Tworzenie kolejki FIFO: File exists I nic więcej się nie dzieję.
Na moje wygląda (a przynajmniej powinno) to tak, że:
1. Potomek wpisuje "klmnop" na deskryptorze 2. 2. Wyświetla się "P1". 3. Przechodzimy do else'a. Na moje powinny się poprostu wypisać wszystkie printf'y, gdyż nie ma i tak żadnego printf'a z buf.
Coś źle rozumiem, czy faktycznie zadanie jest skopane? (albo kolejne podchwytliwe...)
@crushyna przecież jak warunek w if'ie jest spełniony czyli pid==0 to wykonuje się to co jest najpierw czyli ten write i printf ("P1\n"); i kończy if'a a nie przechodzi do elsa żeby przeszło do elsa warunek nie może być spełniony czyli pid musi być inne od 0
@crushyna chyba, że chodzi o coś innego nie mam za dużej wiedzy programistycznej ale trochę c++ ogarniam chociaż ten kod jest w C albo nie wykorzystujesz biblioteki
@crushyna tak jak napisałeś, procesy wykonują się równolegle, ale jest kilka możliwości jeśli chodzi o kolejność wypisywania na wyjściu(przydział procesora), więc może być tak, że najpierw wykona się else a potem proces potomny wypisze swoje printfy.
@crushyna: Po pierwsze primo pisze się "niemniej". #grammarnazi Po drugie primo write(1, ...) powinno dać Ci do myślenia Po trzecie primo komunikat o którym wspomniałeś na początku "Tworzenie kolejki FIFO: File exists" jest co najmniej dziwaczny i wygląda na generowany przez polecenie perror, którego w Twoim kodzie nie widzę. Po trzecie primo zastanów się nad sformułowaniem "blokujące wejście/wyjście". Po czwarte primo nie odpowiedziałeś na moje pytanie z pierwszego
@zakowskijan72: - No to write(1... trochę mi miesza. Nie wiem, do czego się odnosi ta 'jedynka'. - Nie ma perror w skrypcie. Takie coś mi zwraca Ubuntu w terminalu zwyczajnie :P - Co z tym "blokujące wejście/wyjście" mam zrobić? Nie nadążam ;o - Mój błąd, nie zauwayłem. Odpowiedź brzmi: nie ;)
No to write(1... trochę mi miesza. Nie wiem, do czego się odnosi ta 'jedynka'.
Standardowo masz otwarte trzy deskryptory: 0 - stdin 1 - stdout 2 - stderr write(1, ...) to jest właśnie wypisanie na standardowe wyjście. Czyli dokładnie tam gdzie wypisuje printf.
Nie ma perror w skrypcie.
To nie skrypt ale program :)
Co z tym "blokujące wejście/wyjście" mam zrobić?
Generalnie jeśli masz nieblokujące wejście/wyjście to komenda read zwróci
@diwmaron: Poprawka ;) @zakowskijan72: No dobra, aczkolwiek na terminalu nadal nic nie widzę :/ Wejścia / wyjścia nie są blokowane - bo czym? Nie ma nic więcej w kodzie. Wyżej zjadłem tylko int main() :/
@zakowskijan72: Zakładasz, że brakuje jakieś biblioteki? Hmm... To by może pomogło, ale szukałem nawet tego na stackoverflow (na zasadzie: może ja coś źle robię?) ale nie znalazłem...
@crushyna: Include'y to nie biblioteki tylko nagłówki deklarujące funkcje. Biblioteki linkujesz, ale to już inna para kaloszy. To raz. Dwa: nie widzę tu nigdzie badania wartości którą zwraca pipe. To ważne, żeby wykryć, czy funkcja wykonała się poprawnie, czy nie. Trzy: zrób coś z tym formatowaniem, bo oczy bolą. Cztery. Twój program w procesie potomnym zapisze 6 bajtów do fifo i wypisze "P1". W procesie rodzica odczyta cztery bajty, wypisze je
@crushyna: Nie, napisałem wyżej. Różnice w pojawianiu się P1 i P2/P3 na wyjściu polegają na 'wyścigu do procesora'. Czasami będzie pierwszy rodzic, czasami potomek.
Tym razem... ...program coś nie chce działać :/
Pytanie brzmi: co pojawi się na wyjściu standardowym w wyniku wykonania poniższego programu?
Jedyne, czym raczy mnie Ubuntu to: Tworzenie kolejki FIFO: File exists
I nic więcej się nie dzieję.
Na moje wygląda (a przynajmniej powinno) to tak, że:
1. Potomek wpisuje "klmnop" na deskryptorze 2.
2. Wyświetla się "P1".
3. Przechodzimy do else'a. Na moje powinny się poprostu wypisać wszystkie printf'y, gdyż nie ma i tak żadnego printf'a z buf.
Coś źle rozumiem, czy faktycznie zadanie jest skopane? (albo kolejne podchwytliwe...)
#programowanie #pytaniedoeksperta #informatyka #linux
Po if'ie wykonuje się potomek, równolegle zaś proces macierzysty (else) ;)
@crushyna:
Po pierwsze primo pisze się "niemniej". #grammarnazi
Po drugie primo write(1, ...) powinno dać Ci do myślenia
Po trzecie primo komunikat o którym wspomniałeś na początku "Tworzenie kolejki FIFO: File exists" jest co najmniej dziwaczny i wygląda na generowany przez polecenie perror, którego w Twoim kodzie nie widzę.
Po trzecie primo zastanów się nad sformułowaniem "blokujące wejście/wyjście".
Po czwarte primo nie odpowiedziałeś na moje pytanie z pierwszego
- No to write(1... trochę mi miesza. Nie wiem, do czego się odnosi ta 'jedynka'.
- Nie ma perror w skrypcie. Takie coś mi zwraca Ubuntu w terminalu zwyczajnie :P
- Co z tym "blokujące wejście/wyjście" mam zrobić? Nie nadążam ;o
- Mój błąd, nie zauwayłem. Odpowiedź brzmi: nie ;)
Standardowo masz otwarte trzy deskryptory:
0 - stdin
1 - stdout
2 - stderr
write(1, ...) to jest właśnie wypisanie na standardowe wyjście. Czyli dokładnie tam gdzie wypisuje printf.
To nie skrypt ale program :)
Generalnie jeśli masz nieblokujące wejście/wyjście to komenda read zwróci
@zakowskijan72: No dobra, aczkolwiek na terminalu nadal nic nie widzę :/
Wejścia / wyjścia nie są blokowane - bo czym?
Nie ma nic więcej w kodzie. Wyżej zjadłem tylko int main() :/
@crushyna: Inaczej: wejścia/wyjścia są blokujące "z defaultu". Możesz je zmienić na nieblokujące, ale do tego trzeba odpowiedniego kodu.
Main jest. Pytanie, gdzie masz dyrektywy include, które odpowiedni zadeklarują Ci funkcje z których korzystasz.
Hmm... To by może pomogło, ale szukałem nawet tego na stackoverflow (na zasadzie: może ja coś źle robię?) ale nie znalazłem...
Dwa: nie widzę tu nigdzie badania wartości którą zwraca pipe. To ważne, żeby wykryć, czy funkcja wykonała się poprawnie, czy nie.
Trzy: zrób coś z tym formatowaniem, bo oczy bolą.
Cztery. Twój program w procesie potomnym zapisze 6 bajtów do fifo i wypisze "P1". W procesie rodzica odczyta cztery bajty, wypisze je
...odpalałem nie ten program. Błąd w nazwie :D
W każdym razie na wyjściu mam:
klmnP2
opP3
P1
Rozumiem, że write czeka, aż cały plik będzie odczytany?
Różnice w pojawianiu się P1 i P2/P3 na wyjściu polegają na 'wyścigu do procesora'. Czasami będzie pierwszy rodzic, czasami potomek.
Dzięki, jest git :)