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
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]
sopen() öffnet eine Datei und blockiert sie gleich , so das andere 
Prozesse diese Datei nicht öffnen können.
> 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/ ----
#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;
    }
> 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.
 > 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.
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.
> Wer sagt, dass andere Prozesse brav sopen() benutzen?
Keine Ärmchen -- keine Kekse.
> 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.
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.
>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
 > 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.