So, wenn ich mein Programm öfter starte, kann auch jedes schreibend auf
die Schnittstelle zugreifen was ich jetzt verhindern möchte.
Ich habe mir dazu mal flock() angesehen und folgendes ausprobiert:
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY ); //PORT öffnen
if (fd <0)
{ perror(MODEMDEVICE); exit(-1); }
if (flock(fd,LOCK_EX) < 0)
{ perror("PORT IN USE"); exit(-1); }
Es funktioniert allerdings nicht wie ich es erwartet habe.
Ich bin dvon ausgegeangen, das das 2 Programm beim öffnen des
MODEMDIVICE schwirigkeiten bekommen würde, wenn das geflockt ist, was
allerindings nicht der fall ist. Erst im nächstem Schritt, also bei dem
versuch das geflockt()e Device zu öffnen, geht es nicht weiter.
Allerdings wartet flock solage, bis das device wieder frei wird.
Gibt es da ein bessere methode? ich lese gerade man fcntl, allerdings
steige ich da (noch)nicht richtig durch.
Hat jemand schon erfolgreich die Serielle Schnittstelle vor
Fremdzugriffen geschützt?
ps: #define MODEMDEVICE "/dev/ttyS1"
--
Gruß
Arne
Verdammt, ich hab's dir als email geschickt, ansatt in die
Newsgroup, sorry (und scheiss Netscape Messenger)
gruss
-ahmet
hm, was bewirkt den O_NONBLOCK ?
Wie ich es verstanden habe, verhindert es, das das Programm während des
Datei (oder Device) öffnen nicht blockiert wird.
Mein eigentliches Problem: Ich möchte nicht, das mehrere meiner
Programme zur gleichen Zeit auf die serielle Schnittstelle zugreifen
können, also immmer nur ein Programm aktiv sein sollte.
Ich habe irgenwie im Ursprungsposting ein zwei Wörter verdreht:
Ich habe mir dazu mal flock() angesehen und folgendes ausprobiert:
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
//inzwischen auch mit | O_NONBLOCK, was aber nichts änderte.
if (fd <0)
{ perror(MODEMDEVICE); exit(-1); }
if (flock(fd,LOCK_EX) < 0)
{ perror("PORT IN USE"); exit(-1); }
Es funktioniert allerdings nicht wie ich es erwartet habe.
Ich bin davon ausgegangen, das das 2. Programm beim Öffnen des
MODEMDIVICE Schwirigkeiten bekommen würde, da das MODEMDEVICE ja
geflockt ist. Es passiert aber nichts, ich kann es ohne probleme öffnen,
und auch darauf schreiben (mit beiden Programmen).
Erst im nächstem Schritt, also bei dem Versuch das geflockt()e
MODEMDEVICE erneut zu flock()en, geht es nicht weiter.
Allerdings gibt es keine Fehlermeldung, sondern flock() wartet solage,
bis das device wieder frei wird, d.h. das Zuerst gestartete Programm
wieder beendet wird.
--
Gruß
Arne
flock ist BSD-Legacy-Müll und sollte aktiv bekämpft werden.
man lockf
Kauf dir einfach den Stevens und gut ist.
Das ist hier kein Manual-Vorleseservice.
>Mein eigentliches Problem: Ich möchte nicht, das mehrere meiner
>Programme zur gleichen Zeit auf die serielle Schnittstelle zugreifen
>können, also immmer nur ein Programm aktiv sein sollte.
Üblicherweise nimmt man für sowas Lockfiles, die vor dem Zugriff angelegt werden
und nach Gebrauch wieder gelöscht werden. SO macht es z.B. der uucico für uucp,
diverse Fidonet-Geschichten etc etc. Ein eventuell auf dem Port laufender mgetty
erkennt das Lockfile und hält sich dann vornehm zurück.
Saug Dir den Source zum Taylor-UUCP und schau es Dir dort an. Damit bist Du dann
kompatibel zum Rest der Welt.
Mit freundlichen Grüßen
Dipl.-Ing. Frank-Christian Krügel
IstDa Kommunikationssysteme
Das ist ganz genau das dokumentierte (frag mich nicht, wo) Verhalten
von flock. Evtl. steht in /usr/src/linux/Documentation/locks.txt was
dazu.
--
Encrypted Emails strongly preferred! Get PGP from http://www.pgpi.org
PGP-Key: 1024D/DFFE21F1 - Get it from http://mmc.sourceforge.net/biesi.asc
Key also available at PGP Keyservers
Key fingerprint = E60D 24FC BBC5 97CE 5421 C0FE 311B 7F82 DFFE 21F1