Blockierung eines open()
-
Hi,
ich kann einem open() ja ein O_NONBLOCK / O_NDELAY Flag mitgeben, damit er nicht blockieren soll, wenn die Datei oder das Gerät nicht bereit zum Öffnen sind.
Wie lange blockiert open() denn, wenn ich dieses Flag nicht mitgebe? Was mich darauf aufbauend interessiert, ob ich bei einem System rausbekommen kann, wie lange er für ein open() blockieren würde bzw. wann er in einem System in einen Timeout läuft; oder wartet der bis in die Ewigkeit?
Könnte ich denn diesen Timeout auch irgendwie ändern? Oder kann ich das System irgendwie einstellen, daß alle (oder bloß das nächste) open() auch ohne O_NONBLOCK nicht blockieren. Ich möchte eben nicht, einen bestimmten open() Aufruf anpassen, sondern sicherstellen, daß das nächste open() nicht blockiert (auch ohne O_NONBLOCK Flag), oder bloß ganz kurz und sich dann mit einem Fehler verabschiedet (wenn Datei/Gerät nicht bereit).
Geht das irgendwie? Vielen Dank..
-
Hmm, wie bekomme ich ein open() eigentlich zum Blockieren? Ich versuche gerade die ganze Zeit mit irgendwelchen flock()s etc. eine Situation zu erzeugen, wodurch ein open( "/tmp/test.txt", O_RDRW) blockieren würde. Aber das open() scheint immer sofort zu funktionieren...
-
@GmbH:
Erstelle mit mkfifo eine FIFO und Öffne die zum Lesen. Dieser open wird so lange blockieren, bis jemand anderes die FIFO zum Schreiben geöffnet hat.
-
und was ist ein FIFO?
-
fifoo schrieb:
und was ist ein FIFO?
FIFO ist blöd ausgedrückt von mir. mkfifo erzeugt eine named Pipe, also eine Pipe, die man auf Dateisystemebene ansprechen kann.
-
Danke, aber das blockiert bei mir allerdings auch nicht. Beide Prozesse können nacheinander die named pipe einfach so öffnen, ohne das der erste oder irgendiner blockiert.
Wobei mir eigentlich noch wichtiger wäre, wie das bei Zugriffen auf Geräte ist; ob es da Timeouts gibt und die irgendwie verändert werden können?
-
Um den Timeout selbst bestimmen zu können, könntest du ein select () vor das open () setzen: http://linux.die.net/man/2/select
Wenn select () 0 zurück liefert, ist innerhalb des Timeouts nichts passiert, bei > 0 ist was passiert, bei < 0 ist ein Fehler aufgetreten.
-
Vielen Dank.
Das könnte evtl. für mich funktionieren, bin da aber noch nicht sicher. Denn wenn ich select(2) richtig verstanden habe, übergebe ich denen diese Filedescriptor-Sets für read, write & exceptions - wie kann ich denen denn einen FD in ihre Sets verpacken, wenn ich von dem open(), (welches blockiert) erst einen FD bekomme? Ich will ja kein read oder write machen, sondern nur ein open().
-
Hm stimmt, hab ich leider nicht dran gedacht, sorry. Ansonsten fällt mir da jetzt auch keine Möglichkeit mehr ein. Wenn du wirklich unbedingt einen Timout brauchst könntest du vielleicht mit Threads etwas anfangen, das wäre allerdings eher sehr unsauber.