Hozzászólások
Sziasztok!
A segítségeteket szeretném kérni a következő témában: operációs rendszerekből chat programot kell írjak, amit holnap 9:30-kor be is kellene mutassak. A fork() renszerhívást kell alkalmazni, gyermek processzt kreálni az olvasásra, míg a szülő az olvasást végzi (vagy fordítva). A fájlkezelést is UNIX rendszerhívásokkal kell emgvalósítani. A programot elkezdtem írni, a gond az, hogy megakadtam benne. Nem tudom, hogy a gyermek miért nem hajlandó beolvasni egy számot, de még a bedrótozott adatot (pid) sem írja (vagy olvassa ki rendesen). A feladat részletesen:
-----------------------------------------------
3. Talk - kétrésztvevős chat (fájl kommunikációs
implementáció).
Készítsen kétrésztvevős, lokális talk programot, melyen két - ugyanarra a
gépre - bejelentkezett felhasználó cseveghet egymással. A program használjon
közös fájlt a kommunikációra, melybe teljes - enterrel lezárt - sorokat küldjön.
Az implementációhoz fájlba való írás mechanizmust használjon, melyet az
üzenetek továbbításához használ. A program asszinkron működésű legyen, ami
azt jelenti, hogy nem csak váltott irányú üzenettovábbításra alkalmas - bármikor
küldhet és fogadhat üzeneteket. Ennek megvalósítására ajánlott 2 processz
futtatása, melyből az egyik az üzenet küldést, másik a fogadást végzi. A megvalósítás alapját egy fájl képzi, melybe a programok az üzeneteket írják. A fájlhozzáférést szabályozni kell kölcsönös kizárás, szinkronizáció mely tetszőleges mechanizmus megvalósításásval lehetséges, de annak működőképességét a fejlesztőnek bizonyítania kell. Javasolt az flock() syscall használata. A mindkét felhasználó egyetlen programot indít, méghozzá ugyanazt a binárist, paraméter nélkül, vagy ugyanazokkal a paraméterekkel. A fájlkezelést UNIX syscall-okkal kell megvalósítani, nem C könyvtári függvényekkel!
A megvalósításhoz minimálisan szükséges syscall-ok: open, creat, read, write,flock, fork, signal.
---------------------------------------
és amire eddig jutottam:
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char* argv[])
{
int fd1,fd2,gpid,gppid,aaa,d;
char a;
a = ' ';
d=0;
/* char a[];
for(i=0;i<15;i++) a[i] = 'b';*/
/* if (argc != 2)
{
fprintf(stderr, "\nHasznalat: ./chat fajlnev\n\n" );
exit(-1);
}*/
gppid = getpid();
umask(0000);
creat("/home/moin/chat/msg", S_IRWXU|S_IRWXG|S_IRWXO);
fd1 = open("/home/moin/chat/msg", O_RDWR, S_IRWXU);
if (fd1 == -1)
{
fprintf(stderr,"File nyitas hiba: %s\n");
return(-1);
}
lseek(fd1,0,0);
while(flock(fd1,LOCK_SH != 0)) usleep(1000);
if (fork()==0) { /* innentol a gyermek fut, ez vegzi a fajlba irast */
gpid = getpid();
while(1) {
if(d=0) {
printf("\nKerem a szamot: ");
scanf("%d",&d);
fd1 = open("/home/moin/chat/msg", O_RDWR, S_IRWXU); //megnyitas
while(flock(fd1,LOCK_SH != 0)) usleep(10000); //lezarja
write(fd1,&d,sizeof(int)); //kiirja
while(flock(fd1,LOCK_UN != 0 )) usleep(10000); //feloldja
// printf("A szulo processz PID-je: %d\n",gppid);
}
}
}
else { /* innentol a szulo fut, a fajlbol olvasast vegzi */
while(1) {
if(d!=0) {
fd2 = open("/home/moin/chat/msg", O_RDWR, S_IRWXU);
lseek(fd2,0,0);
while(flock(fd2,LOCK_SH != 0)) usleep(10000);
read(fd2,&aaa,sizeof(int));
while(flock(fd2,LOCK_UN != 0 )) usleep(10000);
printf("A kiolvasott PID: %d\n",aaa);
}
}
}
}
---------------------------------
A dolog nagyon fontos és sürgős, úgyhogy minden hozzászólást előre is köszönök!
- A hozzászóláshoz be kell jelentkezni
Na szóval...
Én indítottam a topicot, csak akkor este, mivel nagyon sürgős volt a dolog még a szobatársam account-jával írtam, de mostanra már megjött az enyémhez is a jelszó.
Először is, mélyen tisztelt szaszg! Reagálnék a hozzászólásodra, bár korántsem a te stílusodban, ha nem haragszol.
[quote:79e2d50566="szaszg"]Ez talan d==0 akart lenni
Teljesen igazad van, az d==0 akart lenni. Csak tudod én akkor még, egy teljesen ellenőrízetlen és abszolút csak pillanatnyi (!) forrást illesztettem be nektek. Egyébként ha te este, fáradtan, még soha nem tévesztettél el egy egyenlőség jelet sem, akkor te még nem sok kódot írtál meg életedben.
[quote:79e2d50566="szaszg"]Na most ez mi a sz/ar???? Mitol valtozna meg szerinted a d?????? He???? Bameg a fork uj process-t indit, nem uj szalat!!!!! Az uj processz az uj processz. Szep is lenne, ha at tudna irogatni a masik processz valtozoteruletere...
Na hát kb. ennyi az, ami építő jellegű volt a hozzászólásodban.
[quote:79e2d50566="szaszg"]
BTW a processzek kozotti kommunikacio allatorvosi lova a pipe
BTW2.: a flock mi a sz/arnak???
Úristen, hát ez meg aztán tényleg LOL. Most beillesztem neked ide újra a feladatkiírást, hátha csak diszlexiás vagy, akkor ez elnézhető...
[quote:79e2d50566="tille"]
A program használjon közös fájlt a kommunikációra, melybe teljes - enterrel lezárt - sorokat küldjön.
...
A fájlhozzáférést szabályozni kell kölcsönös kizárás, szinkronizáció mely tetszőleges mechanizmus megvalósításásval lehetséges, de annak működőképességét a fejlesztőnek bizonyítania kell. Javasolt az flock() syscall használata.
Egyébként ez a 3. feladat volt, az 1. ugyanez csak üzenetsoros implementációval, a 2. meg osztott memória használatával.
Ui.: Egyébként a programot reggelre megírtam, magamtól, bemutattam és sikeresen megvédtem.
- A hozzászóláshoz be kell jelentkezni
[quote:280757025c="tille"]
if (fork()==0) { /* innentol a gyermek fut, ez vegzi a fajlba irast */
gpid = getpid();
while(1) {
if(d=0) {
Ez talan d==0 akart lenni[quote:280757025c="tille"]
printf("\nKerem a szamot: ");
scanf("%d",&d);
fd1 = open("/home/moin/chat/msg", O_RDWR, S_IRWXU); //megnyitas
while(flock(fd1,LOCK_SH != 0)) usleep(10000); //lezarja
write(fd1,&d,sizeof(int)); //kiirja
while(flock(fd1,LOCK_UN != 0 )) usleep(10000); //feloldja
// printf("A szulo processz PID-je: %d\n",gppid);
}
}
}
else { /* innentol a szulo fut, a fajlbol olvasast vegzi */
while(1) {
if(d!=0) {
Na most ez mi a sz/ar???? Mitol valtozna meg szerinted a d?????? He???? Bameg a fork uj process-t indit, nem uj szalat!!!!! Az uj processz az uj processz. Szep is lenne, ha at tudna irogatni a masik processz valtozoteruletere...[quote:280757025c="tille"]
fd2 = open("/home/moin/chat/msg", O_RDWR, S_IRWXU);
lseek(fd2,0,0);
while(flock(fd2,LOCK_SH != 0)) usleep(10000);
read(fd2,&aaa,sizeof(int));
while(flock(fd2,LOCK_UN != 0 )) usleep(10000);
printf("A kiolvasott PID: %d\n",aaa);
}
}
}
}
---------------------------------
A dolog nagyon fontos és sürgős, úgyhogy minden hozzászólást előre is köszönök!
Zsiraf
BTW a processzek kozotti kommunikacio allatorvosi lova a pipe
BTW2.: a flock mi a sz/arnak???
- A hozzászóláshoz be kell jelentkezni
Egy par javaslat:
- code blokk hasznalata kod beirasahoz
- tab!!!
- MAN & GOOGLE
Sok sikert.
- A hozzászóláshoz be kell jelentkezni
A BME-n még mindig ez a feleadat?
Még mindig az Ural2-n kell prezentálni?
Én is megcsináltam anno.
Azzal egyetértek, hogy kell egy ilyen feladat ahhoz, hogy az ember megtanuljon szívni az alacsonyszintű API-kkal :-).
Volt benne szívás:
- Otthon csináltam meg az aktuális Linuxommal. Persze volt valami kompatibilitási probléma a fájl lockokkal. A bemutatásnál viszont úgysem tudják ellenőrizni, ohgy működik-e a kölcsönös kizárás, ehhez túl gyors a gép :-). Bemutatás előtt egyszerűen kivettem a binárisból, a forrásban meg bennehagytam ami csak UHU-n működött. Nem buktam le :-)
- Eleve hülyeség child processzeket indítani olyan dologra, amiknek aztán kommunikálni kell a szülővel. Aztán meg lehet a fájl lockkal szívni
Nekem ez a konklúzió szűrődött le ebből a feladatból utólag:
- Mielőtt nekiállunk valaminek értelmesen tervezzük meg. Ha ügyfél hülyén kívánja, győzzük meg az ügyfelet, hogy közös érdekünk az értelmes megoldás.
- Soha ne használjunk alacsonyszintű API-t arra, amire vannak magasszintű megoldások is.
Persze az egyetemet nem lehet meggyőzni :-).
Ezenkívül még megtanultam man-t használni is :-).
Gratulálok, hogy be tudtad fejezni ilyen gyorsan!
szerk - bocs, nem ide volt válasz
- A hozzászóláshoz be kell jelentkezni