gleichen File-Descriptor in zwei Prozessen ansprechen
-
Normalerweise kann man einen File-Descriptor (mit open() geöffnete Datei) auch in einem nach dem Öffnen erzeugten Child-Prozess nutzen. Ich habe dies schon mehrfach auf (älteren) Linux-Systemen so gemacht.
Auf einem Mandrake 8.2 System scheint dies - zumindest bei Devices - nicht zu funktionieren: Wenn ich im Child-Prozess Daten mit write() an das Device "/dev/sound/dsp" sende, schlägt read() im Parent-Prozess fehl (komischer Weise mit "no such file"). Ist der Parent-Prozess "schneller" (ruft also read() früher auf), liefert write() im Child-Prozess "no such file".Oder kann es sein, dass beim Toshiba Satellite Pro 4600 die Soundkarte kein Full-Duplex unterstützt, während mein viel älteres Satellite 220CS das problemlos kann?
-
Wundert mich, wenn Du unter älternen Systemen damit kein Problem hattest, oder ich hab Dein Problem nicht ganz verstanden.
Generell ist nach einem fork jeder offene fd 2x offen, und solange dies der Fall ist, kann man ihn nicht sinvoll nutzen. Wenn Du z.B. eine Datei zum lesen öffnest, dann ein Fork machst, können (soweit ich weiss) nicht beide Prozesse die Datei lesen. Einer muss den fd mittels close schliessen, erst dann kann der andere wieder lesen. Auf jeden Fall bin ich mir sicher, dass dies so bei pipes ist. Wenn man also eine Pipe verwendet, um Daten von Prozess1 an Prozess2 zu senden, muss Prozess1 nach dem Fork den lese-fd schliessen und Prozess2 den schreib-fd.
Vielleicht hiflt Dir das
-
Grundsätzlich ist das (unter POSIX) kein Problem, wenn Parent und Child den gleichen File-Descriptor verwenden - im Prinzip ist das das gleiche, als wenn der Child-Prozess die gleich Datei neu öffnet.
Pipes sind natürlich keine "normalen" Dateien, aber selbst das sollte gehen. Nach meiner Erfahrung gehen beim gleichzeitigen Lesen aus der Pipe die Daten abwechselnd an beide Prozesse, sodass jeder Prozess nur die Hälfte der Zeichen erhält.Ich wollte das Ganze aber anwenden auf ein Device (/dev/dsp), und hier scheint der Device-Treiber der Sound-Karte etwas anders zu ticken: gleichzeitiges Lesen und Schreiben über EINEN File-Descriptor (O_RDWR) mag der Treiber nicht.
Ich konnte das aber lösen, indem ich das Device ZWEIMAL im Parent-Prozess geöffnet habe, einmal O_RDONLY und einmal O_WRONLY. Dann geht's ohne Probleme, und auch hier nutze ich einen der beiden File-Descriptoren sowohl im Child als auch im Parent-Prozess.Martin