Допустим, у меня есть producer.go
и consumer.go
. consumer.go
читает из именованного канала UNIX, а производитель записывает в именованный канал.
Как и ожидалось, если вы запустите только одну программу-производителя или программу-потребитель, она зависнет, потому что на другой стороне конвейера нет ни чтения, ни записи.
Теперь, если я запускаю обе программы, то сразу же CTRL-C от потребителя, производитель продолжает отправлять данные в канал, и, насколько я могу судить, нет ограничений на размер этих данных (я отправил 80 МБ)
Если я снова запускаю программу-потребитель (пока производитель все еще работает), она начинает извлекать данные из именованного канала, но не данные, которые я «пропустил», пока программа-потребитель не работала.
Мой вопрос: Когда устройство чтения именованного канала отключается, что происходит с данными, отправленными в именованный канал?
Вот мои программы consumer.go
и producer.go
:
потребитель.go
package main
import (
"io"
"io/ioutil"
"log"
"os"
"syscall"
)
func main() {
syscall.Mkfifo("fifo0", 0777)
fp, err := os.OpenFile("fifo0", os.O_RDONLY, 0777)
if err != nil {
log.Fatalf("Could not open fifo0: %s", err)
}
tee := io.TeeReader(fp, os.Stdout)
ioutil.ReadAll(tee)
}
продюсер.го
package main
import (
"fmt"
"io"
"log"
"os"
"strings"
"time"
)
func main() {
dots := strings.Repeat(".", 990)
fifo, err := os.OpenFile("fifo0", os.O_WRONLY, 0777)
if err != nil {
log.Fatalf("Could not open fifo0: %s", err)
}
defer fifo.Close()
w := io.MultiWriter(os.Stdout, fifo)
for i := 0; i < 8000; i++ {
fmt.Fprintf(w, "%010d%s\n", i, dots)
time.Sleep(time.Millisecond * 10)
}
}