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

sopen mit Linux

15 views
Skip to first unread message

Markus Wenke

unread,
Apr 18, 2002, 7:50:44 AM4/18/02
to
Hi,

Ich möchte die Windows/Dos-Funktion "sopen()" unter Linux nachbauen. Ist
das nur möglich mit einer Kombination aus open() und fcntl()?

Oder gibt es auch noch eine Andere Möglichkeit unter Linux eine Datei
direkt beim öffnen zu blocken?

Danke im voraus


Markus

Immo 'FaUl' Wehrenberg

unread,
Apr 18, 2002, 11:40:16 AM4/18/02
to
begin followup to the posting of Markus Wenke:

> Ich möchte die Windows/Dos-Funktion "sopen()" unter Linux nachbauen. Ist

Was macht sopen()?

FaUl
end
This article does not support incompatible and broken newsreader.
--
Personal Firewalls bieten genau so viel Schutz gegen Trojaner wie dich eine
Banana im Ohr gegen Raubüberfälle schützt.
Klar kann es sein, daß sich ein Angreifer totlacht, wenn er dich sieht, oder
dich für mental unstabil hält und daher einen Bogen um dich macht. [Fefe]

Markus Wenke

unread,
Apr 19, 2002, 2:19:14 AM4/19/02
to
Immo 'FaUl' Wehrenberg wrote:
> begin followup to the posting of Markus Wenke:
>
>>Ich möchte die Windows/Dos-Funktion "sopen()" unter Linux nachbauen. Ist
>
>
> Was macht sopen()?
>

sopen() öffnet eine Datei und blockiert sie gleich , so das andere
Prozesse diese Datei nicht öffnen können.

Ulli Horlacher

unread,
Apr 19, 2002, 2:55:03 AM4/19/02
to
Markus Wenke <M.W...@whoisup.de> wrote:

> sopen() öffnet eine Datei und blockiert sie gleich , so das andere
> Prozesse diese Datei nicht öffnen können.

Viele UNIXe haben ueberhaupt keine solche Lock-Funktion, das ist also
nicht portabel. Bei Linux sind dafuer 2-3 Systemcalls notwendig, ein
atomares open_and_lock() gibt es nicht.

Weitere Infos dazu findest du in /usr/src/linux/Documentation/mandatory.txt


--
-- Ullrich Horlacher, BelWue Coordination ------- mailto:fram...@belwue.de --
Computing Centre University of Stuttgart (RUS) phone: +49 711 685 5868
Allmandring 30, D-70550 Stuttgart, Germany fax: +49 711 678 8363
-- saft://saft.belwue.de/framstag ----------------- http://www.belwue.de/ ----

Peter Simons

unread,
Apr 19, 2002, 5:18:15 AM4/19/02
to
Ich habe den Code nur so runtergeschrieben, man sehe also bitte mir
nach, wenn er nicht beim ersten Versuch durch den Compiler geht:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int sopen(const char *pathname, int flags)
{
int fd = open(pathname, flags);
if (fd >= 0)
{
struct flock lock;
lock.l_type = (flags & O_RDONLY) ? F_RDLCK : F_WRLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;
if (fcntl(fd, F_SETLKW, &lock) != 0)
{
close(fd);
return -1;
}
}
return fd;
}

Ulli Horlacher

unread,
Apr 19, 2002, 6:06:55 AM4/19/02
to
Peter Simons <sim...@cryp.to> wrote:

> int sopen(const char *pathname, int flags)

Das macht kein "öffnet eine Datei und blockiert sie gleich , so das andere
Prozesse diese Datei nicht öffnen können" wie von Markus Wenke gefordert.

Weder das "gleich" noch das "blockieren" ist erfuellt.

Peter Simons

unread,
Apr 19, 2002, 8:13:52 AM4/19/02
to
Ulli Horlacher writes:

> Das macht kein "öffnet eine Datei und blockiert sie gleich , so das

> andere Prozesse diese Datei nicht öffnen können" [...]

Dann nenn mir mal einen Fall, in dem sopen() erfolgreich zurückkommt,
obwohl ein anderer Prozeß dieselbe Datei (mit Filelocking) zum
Schreiben geöffnet hat.

Ulli Horlacher

unread,
Apr 19, 2002, 12:10:55 PM4/19/02
to
Peter Simons <sim...@cryp.to> wrote:

Wer sagt, dass andere Prozesse brav sopen() benutzen? Kooperatives
Verhalten ist Wunschdenken von Programmieren, die noch an das Gute im
Menschen [TM] glauben :-)

Advisory locking funktioniert genauso schlecht wie kooperatives
Multitasking: "Keiner fasst mir die Datei an, sonst bin ich beleidigt!"


Somit loest deine sopen() Implementation nicht die gestellte Aufgabe.

Peter Simons

unread,
Apr 19, 2002, 12:20:59 PM4/19/02
to
Ulli Horlacher writes:

> Wer sagt, dass andere Prozesse brav sopen() benutzen?

Keine Ärmchen -- keine Kekse.

Felix von Leitner

unread,
Apr 19, 2002, 12:32:14 PM4/19/02
to
Thus spake Ulli Horlacher (fram...@bofh.BelWue.DE):

> Wer sagt, dass andere Prozesse brav sopen() benutzen? Kooperatives
> Verhalten ist Wunschdenken von Programmieren, die noch an das Gute im
> Menschen [TM] glauben :-)

> Advisory locking funktioniert genauso schlecht wie kooperatives
> Multitasking: "Keiner fasst mir die Datei an, sonst bin ich beleidigt!"

ROTFL, ist dir eigentlich mal aufgefallen, daß das im Dateisystem ganz
prächtig funktioniert? Selten löschen irgendwelche Prozesse
unaufgefordert dein Home.

Wer sich nicht dran hält, wird standrechtlich erschossen. Ende der
Diskussion. Alle Programme auf meinem Rechner verhalten sich
ausgesprochen kooperativ.

Ulli Horlacher

unread,
Apr 19, 2002, 5:36:43 PM4/19/02
to

Tja, wenn du Aermster auch nicht news:<a9of07$aht$1...@news.BelWue.DE>
gelesen hast. Da steht naemlich wie es trotzdem geht.

Nur dein sopen() funktioniert halt nicht.

Uwe Ohse

unread,
Apr 19, 2002, 11:38:16 AM4/19/02
to
Hallo Peter,

>Dann nenn mir mal einen Fall, in dem sopen() erfolgreich zurückkommt,
>obwohl ein anderer Prozeß dieselbe Datei (mit Filelocking) zum
>Schreiben geöffnet hat.

Du übersiehst einen entscheidenen Anwendungsfall, nämlich den daß
sichergestellt wird daß kein anderer Prozess die Datei bzw. das Gerät
auch nur 100 Taktzyklen geöffnet hat: Beispielsweise /dev/rst0, ein
Tapedevice, bei dem ein Schließen des Gerätes einen rewind bedeutet.

sopen() ist unter Unix nicht implementierbar, wenn nicht _alle_
Programme, die jemals auf die Datei / das Gerät zugreifen, eine
externe Synchronisation (zusätzliches Lock auf andere Datei?)
beachten. "find | xargs grep".

Gruß, Uwe

Peter Simons

unread,
Apr 20, 2002, 11:35:42 AM4/20/02
to
Uwe Ohse writes:

> Du übersiehst einen entscheidenen Anwendungsfall [...]:
> Beispielsweise /dev/rst0 [...]

Ist natürlich völlig richtig, aber da der "OP" danach im Rahmen der
Portierung einer Windows-Software fragte, gehe ich nicht davon aus,
daß er mit sopen() Device-Files öffnen möchte.


> sopen() ist unter Unix nicht implementierbar [...]

Habe ich auch nie behauptet.

0 new messages