Named Pipes sind eine Prozesskommunikationsmethode auf relativ niedriger Ebene im Betriebssystem. Dabei handelt es sich um eine Prozesskommunikationsmethode, die Dateien als Vermittler verwendet. In der Go-Sprache wird die Unterstützung für Named Pipes über das OS-Paket bereitgestellt. In diesem Artikel stellen wir vor, wie Sie Named Pipes für die Kommunikation zwischen Prozessen in Go verwenden.
1. Das Konzept der Named Pipes
Eine Named Pipe ist eine spezielle Datei, auf die mehrere Prozesse gleichzeitig zugreifen können. In Linux-Systemen sind Named Pipes ein spezieller Dateityp, der irgendwo im Dateisystem vorhanden ist und von verschiedenen Prozessen gemeinsam genutzt werden kann. Mit Named Pipes können Daten zwischen verschiedenen Prozessen übertragen werden. Da es sich bei Named Pipes um Dateien in einem Dateisystem handelt, können sie zur Kommunikation zwischen allen Prozessen verwendet werden, die Zugriff auf das Dateisystem haben.
2. Grundprinzipien der Verwendung von Named Pipes in Go
In der Go-Sprache erfolgt die Verbindung zu Named Pipes über die Verwendung der Funktionen im Betriebssystempaket. Benannte Pipes werden mit den entsprechenden Funktionen im OS-Paket geöffnet und geschlossen. Prozesse können eine Named-Pipe-Datei gemeinsam nutzen, indem sie sie an andere Prozesse übergeben, und jeder andere Prozess, der auf die Named-Pipe-Datei zugreift, kann Daten lesen und schreiben.
3. Verwenden Sie Named Pipes, um zwischen zwei Go-Prozessen zu kommunizieren.
Es ist sehr einfach, Named Pipes für die Kommunikation zwischen zwei Go-Prozessen zu verwenden. Wir werden hier zwei Go-Programme schreiben, eines davon schreibt eine Nachricht an die Named Pipe und das andere Programm liest die Nachricht aus der Named Pipe und druckt sie aus.
package main import ( "fmt" "os" ) func main() { fifo := "/tmp/myfifo" // 命名管道文件路径 msg := "Hello World!" // 要写入管道的消息 // 打开管道文件 pipeout, err := os.OpenFile(fifo, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { fmt.Println("Error: ", err) return } defer pipeout.Close() // 写入消息到管道 _, err = pipeout.WriteString(msg) if err != nil { fmt.Println("Error: ", err) return } fmt.Println("Message sent to named pipe!") }
In Zeile 5 definieren wir eine Konstante fifo
, um den Pfad darzustellen, in dem sich die Named-Pipe-Datei befindet. Dann definieren wir in Zeile 6 die Nachricht, die in die Pipe geschrieben werden soll. Als nächstes öffnen wir die Named-Pipe-Datei und schreiben die Nachricht in die Pipe. In Zeile 11 verwenden wir die Funktion os.OpenFile()
, um die Named-Pipe-Datei zu öffnen, und die Option os.O_WRONLY
, um die Datei im schreibgeschützten Modus zu öffnen. Als nächstes verwenden wir in Zeile 15 die Funktion pipeout.WriteString()
, um die Nachricht in die Named Pipe zu schreiben. fifo
表示命名管道文件所在的路径。然后,在第6行中,我们定义了要写入到管道中的消息。下面,我们将打开命名管道文件,并将消息写入管道中。在第11行中,我们使用os.OpenFile()
函数打开命名管道文件,并使用os.O_WRONLY
选项以只写模式打开文件。接下来,在第15行中,我们使用pipeout.WriteString()
函数将消息写入到命名管道中。
package main import ( "fmt" "os" ) func main() { fifo := "/tmp/myfifo" // 命名管道文件路径 msg := make([]byte, 1024) // 打开管道文件 pipein, err := os.OpenFile(fifo, os.O_RDONLY, 0) if err != nil { fmt.Println("Error: ", err) return } defer pipein.Close() // 读取消息从管道 n, err := pipein.Read(msg) if err != nil { fmt.Println("Error: ", err) return } fmt.Println("Message received from named pipe: ", string(msg[:n])) }
在第5行中,我们定义了一个常量fifo
表示命名管道文件所在的路径。然后,在第6行中,我们定义了一个byte数组msg
,用于存储从管道中读取的消息。下面,我们将打开命名管道文件,并从管道中读取消息。在第11行中,我们使用os.OpenFile()
函数打开命名管道文件,并使用os.O_RDONLY
选项以只读模式打开文件。接下来,在第17行中,我们使用pipein.Read()
函数从命名管道中读取消息,并将其存储到msg
In Zeile 5 definieren wir eine Konstante fifo
, um den Pfad einer benannten Pipe darzustellen wo sich die Datei befindet. Dann definieren wir in Zeile 6 ein Byte-Array msg
, um die aus der Pipe gelesene Nachricht zu speichern. Als nächstes öffnen wir die Named-Pipe-Datei und lesen Nachrichten aus der Pipe. In Zeile 11 verwenden wir die Funktion os.OpenFile()
, um die Named-Pipe-Datei zu öffnen, und die Option os.O_RDONLY
, um die Datei im schreibgeschützten Modus zu öffnen. Als nächstes verwenden wir in Zeile 17 die Funktion pipein.Read()
, um die Nachricht aus der Named Pipe zu lesen und sie im Array msg
zu speichern. Abschließend drucken wir in Zeile 19 die Nachricht aus, die wir erhalten haben.
Das obige ist der detaillierte Inhalt vonWie verwende ich Named Pipes in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!