-
Mobilarena
Új hozzászólás Aktív témák
-
Forest_roby
őstag
válasz
Bazsesz #2360 üzenetére
Hi!
Szemaforok: légyeg, ha egy erőforrást egyszerre két folyamat akar használni, akkor ütköznének a folyamatok, -biztos hogy hibás eredmények születnének. Most cifrázhatnám, hogy milyen sulyos hibák történhetnének, de el tudjátok képzelni... No, első gondolatra válozókkal meglehetne oldani, a problémát ( ezt most nem részletezem ) , de az a probléma, hogy ott ugyanúgy összeakadna a progi, ez nem megoldás. A szemafórok az oprendszer (LINUX) által biztosított olyan változók, amiknél nem fordulhat elő az, hogy egszerre használják ugyanazt az eszközt... ( hogy ezt hogy érik el, az legyen egy okosabb embernek az összefoglalója ).
Szóval ilyen problémák megoldására a szemaforokat kell használni....
Használat:
A szemaforokon két műveletet értelmezünk:
Csökkentés és Növelés
A szemafor értéka 0 és 1 lehet. Ha 0 -akkor blokkolt a folyamat és ha 1 akkor szabad a futás.
Csökkentés:
Amikor a progi belépni akar a kritikus szakaszba akkor fog csökkenteni, ha a szemafor 0 volt akkor várólistára kerűl a folyamat, ha 1 volt akkor a folyamat lefut és a szemafor 1-ről 0-ra csökken.
Növelés:
A folyamat végrehajtása után történik meg. A szemafort 1-re álitja. Ha lenne olyan folyamat, amely e miatt a szemafor miatt volt blokkolt állapotban, arról a Linux gondoskodik, hogy az felszabaduljon a blokkolt állapotból.
(dióhélyban /majd vissza kell olvasnom, hogy mennyi baromságot írtam ide le....)
int semget(...)
int semctl(...)
int semop(...)
fv-eknek érdemes utánna nézni, sajna a progi amit tudnék adni 125 soros és most nincs kedvem begépelni, de google-on biztos sokat találsz....
remélem azért nem volt teljesen hasztalan ezt begépelnem...
Sok sikert!
[Szerkesztve] -
Robaj
addikt
válasz
Bazsesz #2360 üzenetére
Vmi ilyesmi:
#define N 100
typedef int semaphore;
semaphore mutex=1;
semaphore empty=N;
semaphore full=0;
void producer(void)
{ int item;
while (TRUE){
produce_item(&item);
down(&empty);
down(&mutex);
enter_item(item);
up(&mutex);
up(&full);
}
}
void consumer(void)
{
int item;
while (TRUE) {
down(&full);
down(&mutex);
remove_item(&item);
up(&mutex);
up(&empty);
consume_item(item);
}
}
Előadásjegyzetben van/volt, hámozz ki belőle vmit. Nekem nem sikerült. De 2-es megvan. -
Jester01
veterán
válasz
Bazsesz #2360 üzenetére
A szemaforok tulajdonképpen számlálók amik általában azt jelentik, hogy valami X dologból rendelkezésre áll valamennyi. A számláló növelése nem várakozik, ez csak azt jelenti, hogy több X áll rendelkezésre. Ha most jön valaki, hogy neki kellene valamennyi X, akkor a rendelkezésre álló mennyiséget az igényelt mennyiséggel csökkenteni kell, illetve ha éppen nincs elegendő, akkor várni kell.
A te feladatodra rátérve: 2 szemaforra lesz szükség, mivel a probléma szimmetrikus. Az egyik jelzi, hogy az A program írt valamit amit a B kiolvashat, illetve fordítva.
A program:
write(); /* írunk valamit */
sem_up(A); /* jelezzük, hogy A írt */
sem_down(B); /* várunk amíg B jelzi, hogy írt */
read(); /* kiolvassuk */
B program:
sem_down(A); /* várunk amíg A jelzi, hogy írt */
read(); /* kiolvassuk */
write(); /* írunk valamit A-nak */
sem_up(B); /* jelezzük, hogy B írt */ -
shev7
veterán
válasz
Bazsesz #1771 üzenetére
C ben nincs olyan hogy string, nem? char*-ot hasznalsz/unk. Innen meg egyszeru, mivel a tombok ugy mukodnek mint a pointerek, ezert ha van egy olyanod hogy char* string1, akkor a string1[ 0 ] a string elso karakteret adja vissza, es igy tovabb. Persze figyelni kell a hosszra, de azt meg lekerdezed a stlen fuggvennyel.
A masik modszer, amihez semmit nem kell gondolkodniaz strncmp fv. Ez ket stringbol hasonlitja ossze az elso n karaktert ( strncmp(char*,char*,int) ) 0val ter vissza, ha egyezes van.
[Szerkesztve] -
bdav
őstag
válasz
Bazsesz #1767 üzenetére
na ezt a hszedet nem tudom értelmezni. de ha az eredeti problémát jól vágom akkor annyi kell h. a '\n' '\t' és ' ' karaktereket számold. amit írtál progi az minden karakter előfordulását nézi, tök feleslegesen. (ráadásul külön függvényt kér)
én így írnám meg:
void charCount(char* fileName)
{
FILE* f=fopen(''fileName'', ''r'');
int s=0;
int spaceCount=0;
int nCount=0;
int tCount=0;
do
{
s=fgetc(f);
if(s=='\n') nCount++;
if(s=='\t') tCount++;
if(s==' ') spaceCount++;
} while(s!=EOF);
printf(''\\n száma: %d'\n\\t száma: %d\nspace száma: %d', nCount, tCount, spaceCount);
}
mod: amit te irtál az is kb. ugyanezt teszi, csak megszámol mindent feleslegesen. ja és a while és for ciklust megint felcserélted. Kiírásnál meg nem lennék benne biztso hogyha a \n-t karakterként írod ki akkor nem tesz e inkább ujsort (ezért írok én pl. \\-t). egy iffel rá tudsz szürni mondjuk és akkor csak a szükségeseket írja ki (if(c[ i ]=='\n') printf(''\\n száma: %d'', c[ i ]);)
[Szerkesztve]
Új hozzászólás Aktív témák
Hirdetés
● olvasd el a téma összefoglalót!
- Kormányok / autós szimulátorok topikja
- Kerékpárosok, bringások ide!
- Szünetmentes tápegységek (UPS)
- Milyen TV-t vegyek?
- Dell notebook topic
- Mikrokontrollerek Arduino környezetben (programozás, építés, tippek)
- E-book olvasók
- Autós topik
- Milyen okostelefont vegyek?
- Microsoft Office és Office 365 topic
- További aktív témák...
- AKCIÓ - INGYEN POSTA - ÚJ GAMER PC - i5-12400F - RTX 5060Ti - 16GB RAM -1TB SSD -www.olcsogamerpc.hu
- Sony TA FE530R
- AKCIÓ!!! GAMER PC: Új RYZEN 5 4500-5600X +GTX 1660 SUPER +16-64GB DDR4! GAR/SZÁMLA! 50 FÉLE HÁZ!
- TP-Link HX220 WIFI AP ÚJ BONTATLAN.
- GAMER PC: Új RYZEN 7 5700/5800X +RTX 5060/5060Ti/5070/5070Ti +16-64GB DDR4! GAR/SZÁMLA! 50 FÉLE HÁZ!
- BESZÁMÍTÁS! Sony PlayStation4 PRO 1TB fekete konzol extra játékokkal garanciával hibátlan működéssel
- Apple iPhone 13 128GB, Kártyafüggetlen, 1 Év Garanciával
- ÁRGARANCIA!Épített KomPhone i5 14600KF 32/64GB RAM RX 9070 16GB GAMER PC termékbeszámítással
- IPhone 15 Pro 128GB Szép Állapot! Akku:88% Jótállás: 2026.04.09.-ig
- Huawei P20 Lite 64GB, Kártyafüggetlen, 1 Év Garanciával
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest