Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Zugriff von 2 Programmen verhindern,

6 views
Skip to first unread message

Arne Pagel

unread,
Aug 25, 2001, 7:17:29 AM8/25/01
to
Hallo, inzischen habe ich es mal geschafft, ein Programm zu schreiben,
das mir etwas auf der Seriellen Schittstelle ausgibt, und auch wieder
etwas einliest, etwa so wie das Asynchron Beispiel aus der
Serial-Programming Howto.

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

Ahmet Ocakli

unread,
Aug 25, 2001, 12:56:11 PM8/25/01
to
Ahmet Ocakli wrote:
> aehm, bin nicht ganz sicher ob dir das weiterhilft,
> aber oeffne doch mit O_NONBLOCK
>
> gruss
> -ahmet

Verdammt, ich hab's dir als email geschickt, ansatt in die
Newsgroup, sorry (und scheiss Netscape Messenger)

gruss
-ahmet

Arne Pagel

unread,
Aug 25, 2001, 6:24:45 PM8/25/01
to
>>aehm, bin nicht ganz sicher ob dir das weiterhilft,
>>aber oeffne doch mit O_NONBLOCK

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

Felix von Leitner

unread,
Aug 25, 2001, 6:30:52 PM8/25/01
to
Thus spake Arne Pagel (ar...@pagelnet.de):

> Ich habe mir dazu mal flock() angesehen und folgendes ausprobiert:

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.

Frank-Christian Kruegel

unread,
Aug 26, 2001, 2:45:54 AM8/26/01
to
On Sun, 26 Aug 2001 00:24:45 +0200, Arne Pagel <ar...@pagelnet.de> wrote:

>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

Christian Biesinger

unread,
Aug 26, 2001, 6:03:54 PM8/26/01
to
Arne Pagel wrote in de.comp.os.unix.programming:

> 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.

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

0 new messages