Wie kann man bei Unix-pipes verwendet werden, zwischen dem Prozess und thread?
Ich versuche, Kanal Daten über Leitungen, wenn ein signal ankommt, aus einen thread, den main-Prozess.
Ist das möglich?
Wie kann das getan werden?
Das problem:
- Ein Kind-thread liest die Daten und legt Sie in eine queue.
- Hauptanwendung macht seine eigenen Sachen, aber, wenn Daten in der Warteschlange verfügbar sind, es sollte darauf hingewiesen werden, von dem thread, und starten Sie die Verarbeitung der Daten (main-thread hat Zugriff auf die Warteschlange).
Wie sollte dieses Szenario umgesetzt werden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, es ist möglich durch die Rohre.
Schritt ein Anruf Rohr um ein Rohr:
Schritt 2 übergeben, die fileDescriptors[0], um die wichtigsten Verfahren und fileDescriptorsEins zu dem thread. In der Main warten, bis die pipe geschrieben werden, durch das Lesen von fileDescriptors[0]
Schritt 3, aus deinem thread schreiben fileDescritporsEins, wenn das signal Auftritt,
Es kann getan werden, aber es ist eher unnötig. Leitungen sind bestimmt für die inter-Prozess-Kommunikation. Threads teilen sich den gleichen Speicher und können daher direkt miteinander kommunizieren, solange Sie die Verriegelung korrekt.
Wenn du redest
pipe()
eher als|
, dann ja. Rohre können in der Regel nur behandelt werden, wie ein file-descriptor. Sie müssen nur öffnen Sie das Rohr und die Bereinigung der input in einem thread, und die Ausgabe in der anderen.Wie schon andere gesagt haben, dies kann sein mehr ärger als es Wert ist.
Jedoch, wenn Sie darauf bestehen.
Wahrscheinlich am einfachsten, einfach sich zu öffnen zwei Rohre mit
popen
undrw
- Modus, bevor Sie laichen in dem thread. Wählen Sie eine für Haupt-->thread und den anderen für main<--thread und gehen Sie einfach weiter.Oder Sie öffnen konnte insgesamt vier Datei-Deskriptoren, die nach dem laichen, als wären Sie zwei verschiedene Prozesse
Könnte man tun, dass der apache hat eine ähnliche "graceful restart" - option. (siehe hier). Verwenden Sie so etwas wie:
Senden ein signal an die Eltern. Andere haben den code oben, um zu laichen, die Datei-Deskriptoren und fangen Sie es auf der übergeordneten Seite.
Aber ich Neige dazu, zu vermeiden, die Signale für scripted Interprozess-Kommunikation, statt mit Ihnen nur für den "Benutzer gesendeten" Nachrichten, wie start/stop/restart/refresh. Was Sie zu ersetzen, hängt von Ihrem Anwendungsfall: man könnte ein messaging-variable, oder wenn Ihre Haupt-Prozess ist in eine server-Schleife, Sie könnte "wählen Sie" auf ein Rohr an den Anfang der Schleife zu sehen, wenn das Kind geschickt hat und eine refresh-Nachricht. Es gibt wahrscheinlich viele andere, die ich bin fehlt.