Ich benutze socketpair() Systemaufruf für IPC und es gibt 0,1 oder 2 Dateideskriptor zurück, wenn einer von ihnen verfügbar ist. Der Systemaufruf write() für fd 0 schreibt in STDIN, wodurch die Ausgabe meiner Anwendung durcheinander gebracht wird. Gibt es etwas, das ich tun kann, um zu verhindern, dass das Socketpair() 0,1 oder 2 als fd zurückgibt?Wie verhindere ich, dass der Systemaufruf socket() den Dateideskriptor 0,1 oder 2 zurückgibt?
Antwort
Schließen Sie Standardeingabe, Standardausgabe oder Standardfehler nicht vor der Verwendung von socketpair()
. Ggf. öffnen Sie /dev/null
für diese Dateideskriptoren.
Wenn Datei-Deskriptoren (von jedem Systemaufruf - open()
, socket()
, socketpair()
, accept()
, pipe()
, dup()
, usw.) zugeordnet sind, verwendet die Zahl ist immer die niedrigsten verfügbaren (ungeöffnet) Nummer. Wenn Sie 0, 1 oder 2 von socketpair()
bekommen, bedeutet das, dass Sie den entsprechenden Deskriptor geschlossen haben - aber warum haben Sie das getan? Vergiss es; mach es nicht.
Oder beheben Sie es durch Öffnen /dev/null
. Denken Sie daran, dass 0 lesbar sein sollte und 1 und 2 beschreibbar sein sollten (und dass es egal ist, ob 0 beschreibbar ist und 1 und 2 lesbar sind; tatsächlich, wenn eine Shell in einem Terminal gestartet wird, sind alle drei oft lesbar und beschreibbar).
Sie haben Recht, ich schloss nie die STD *. Das Problem war woanders. –
- 1. Dateipfad oder Dateideskriptor für ARM Systemaufruf ausführen
- 2. Wie verhindere ich, dass Pythons urllib (2) einer Weiterleitung folgt
- 3. Wie verhindere ich, dass Chrome in den Debug-Modus wechselt?
- 4. Wie verhindere ich, dass Browser Cookies speichern?
- 5. Wie verhindere ich, dass Windows-Anwendungen den Fokus stehlen
- 6. Wie verhindere ich, dass mein git korrumpiert?
- 7. Wie verhindere ich, dass Sequels postgres-pr-Adapter Daten mit der falschen Kodierung zurückgibt?
- 8. Wie verhindere ich, dass Hibernate Zeichenfolgen schneidet?
- 9. Wie erzwinge ich, dass die Regressionslinie durchgeht (0,1)?
- 10. Wie verhindere ich, dass Passwörter gespeichert werden?
- 11. Wie verhindere ich, dass IIS Websites kompiliert?
- 12. Wie verhindere ich, dass der Browser teure DNS-Lookups durchführt?
- 13. Systemaufruf zurückgibt, bevor rsync abgeschlossen ist
- 14. Wie verhindere ich, dass XMLAGG eine Zeile in einer Unterabfrage erstellt, die keine Zeilen zurückgibt?
- 15. Wie verhindere ich, dass IVsBuildPropertyStorage.SetItemAttribute Sonderzeichen löscht?
- 16. Linux Socket Systemaufruf "Akzeptieren" niemals zurück?
- 17. Wie verhindere ich, dass Chrome Eingabefelder vorfüllt?
- 18. Wie verhindere ich, dass der iPhone-Bildschirm während der Ausführung meiner Anwendung gedimmt oder ausgeschaltet wird?
- 19. Wie verhindere ich, dass JavaScript meine Daten ändert?
- 20. Wie verhindere ich, dass der IE pixelige Schaltflächen erstellt?
- 21. Wie verhindere ich, dass der MongoDB-Replikatsatz die Primärdatenbank abfragt?
- 22. Wie verhindere ich, dass windbg der interaktive Debugger ist?
- 23. Wie verhindere ich, dass Ergebnisse den Header der interaktiven Python-Shell anzeigen?
- 24. Der Dateideskriptor gibt den falschen Wert zurück
- 25. Störungsbereitschaftsbenachrichtigung für Select Systemaufruf
- 26. Wie verhindere ich, dass die SVERWEIS-Formel Fehltreffer/Fehlalarme gibt?
- 27. Wie verhindere du, dass Proguard Typparameter entfernt?
- 28. Wie verhindere ich den Speicherverlust von unique_ptr
- 29. Wie verhindere ich, dass Button Surround in Java angezeigt wird?
- 30. Wie verhindere ich, dass Tabellendaten mein Layout beschädigen?
Mit 'write()' an FD 0 wird geschrieben, mit wem 0 verbunden ist. Wenn es ein Socket ist, ist es nicht "stdin", und es kann nicht "die Ausgabe Ihrer Anwendung durcheinander bringen". Es ist nicht klar, dass Sie ein Problem zu lösen haben. – EJP
Der Rückgabewert von socketpair ist ** nicht ** ein Dateideskriptor, es ist ein Statuscode (-1 oder 0), dh Fehler oder Erfolg. – wildplasser
Mein Schlechter, ich wollte sagen, dass der Socket den Dateideskriptor 0,1 oder 2 zugewiesen wird. –