• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C] Czyszczenie bufora stdin

Object Storage Arubacloud
0 głosów
2,047 wizyt
pytanie zadane 21 stycznia 2017 w C i C++ przez qvo Obywatel (1,670 p.)

Nie potrafię poradzić sobie z problemem czyszczenia bufora. Program działa następująco: jeśli semafor jest podniesiony, to wszystko jest w porządku i po każdym obrocie mam odczytanie linii z stdin i przekazanie jej do pliku.

Problem pojawia się kiedy opuszczam semafor i program czeka na jego odblokowanie w linii >>semlock(semid1);
Jeśli w tym czasie kiedy program czeka zacznę wpisywać coś do konsoli, to po odblokowaniu pętla przelatuje tyle razy ile wstawiłem nowych linii. Nie chcę tego efektu, chciałbym by w chwili kiedy program czeka, wszystkie linie wprowadzone do stdin były ignorowane.

1
komentarz 21 stycznia 2017 przez Patrycjerz Mędrzec (192,320 p.)
Używasz wielowątkowości? Powiedz również, jak wygląda to wprowadzanie danych, gdy semafor jest opuszczony?
komentarz 21 stycznia 2017 przez qvo Obywatel (1,670 p.)
Wieloprocesorowości raczej i komunikuje się między procesami za pomocą pamięci dzielonej, sygnałów i semaforów.

Chodzi o to że podczas normalnej pracy semafory nie wpływają na wykonanie w ogóle, ale gdy proces dostanie sygnał wstrzymania pracy - wtedy opuszcza semafor i oczekuje nad tym scanf(...) do momentu aż otrzyma inny sygnał który podniesie semafor.

I teraz przykładowo jest sytuacja że wstrzymujemy pracę, ale w tym czasie użytkownik wprowadza coś sobie do strumienia wejściowego (mimo że program jest wstrzymany). Chcę by w obsłudze sygnału wznawiającego pracę oczyszczać bufor ze śmieci.

Próbowałem użyć fflush(stdin), bo gdzieś tak wyczytałem ale to chyba działa kompletnie inaczej.
1
komentarz 21 stycznia 2017 przez Patrycjerz Mędrzec (192,320 p.)
Ale chciałbym wiedzieć, jak wygląda to wprowadzanie danych w trakcie zablokowania programu. Możesz wpisywać znaki? Możesz potwierdzać je enterem, nawet wielokrotnie? Jeśli wprowadzisz parę takich ciągów i zatwierdzisz je parę razy enterem, to wszystkie te linie zostaną wzięte pod uwagę, czy tylko pierwsza? Reasumując, prosiłbym o więcej konkretów na temat wprowadzania danych.
komentarz 21 stycznia 2017 przez qvo Obywatel (1,670 p.)
Dokładnie tak jak mówisz czyli - mogę wpisywać ciągi i zatwierdzać je enterem wielokrotnie, a po odblokowaniu semafora - wszystkie te ciągi zostają obsłużone przez pętle jeden po drugim, ale jest to sytuacja której nie chcę. Chcę je po prostu zignorować

1 odpowiedź

+1 głos
odpowiedź 21 stycznia 2017 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 30 stycznia 2017 przez qvo
 
Najlepsza

Jeśli korzystasz z Windowsa, spróbuj użyć dość prostego sposobu na wyczyszczenie bufora klawiatury:

while (kbhit())
	getch();
komentarz 21 stycznia 2017 przez qvo Obywatel (1,670 p.)
Dzięki, jutro przetestuję i dam znać czy przeszło. Rozumiem że powinienem to umieścić w procedurze obsługi sygnału wznowienia, jeszcze przed podniesieniem semafora.
komentarz 21 stycznia 2017 przez Patrycjerz Mędrzec (192,320 p.)

Przed samym wywołaniem scanf.

Podobne pytania

0 głosów
1 odpowiedź 449 wizyt
pytanie zadane 26 kwietnia 2020 w C i C++ przez ResCrove Obywatel (1,700 p.)
0 głosów
1 odpowiedź 183 wizyt
pytanie zadane 23 października 2020 w C i C++ przez adamos321 Nowicjusz (140 p.)
0 głosów
2 odpowiedzi 1,657 wizyt
pytanie zadane 2 stycznia 2017 w Java przez rubesom Obywatel (1,690 p.)

92,583 zapytań

141,434 odpowiedzi

319,669 komentarzy

61,966 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...