我有一个小型服务器程序,它接受TCP或本地UNIX套接字上的连接,读取一个简单的命令,并根据命令发送一个回复.问题是客户端有时可能对答案没兴趣并且提前退出,因此写入该套接字将导致SIGPIPE并使我的服务器崩溃.什么是防止崩溃的最佳做法?有没有办法检查线的另一边是否还在读?(select()似乎在这里不起作用,因为它总是说套接字是可写的).或者我应该用处理程序捕获SIGPIPE并忽略它?
我所知道的个人用途SIGPIPE和SIGIGN.
是什么
signal(SIGPIPE, SIG_IGN);
Run Code Online (Sandbox Code Playgroud)
到底怎么办?
我目前有这个功能,它通过 ffmpeg 管道 youtubedl 命令,然后将 ffmpeg 的输出通过管道传输到 HTTP 客户端。
func pipeThruFfmpegToMp3(vi *VideoInfo, rw web.ResponseWriter) error {
var ffmpeg *exec.Cmd
ffmpeg = exec.Command("ffmpeg", "-i", "-","-acodec", "libmp3lame","-f", "mp3","-")
}
youtube := exec.Command("youtube-dl", "-f", "137", "video_url", "-o", "-")
var ytbuf, ffbuf bytes.Buffer
youtube.Stderr = &ytbuf
ffmpeg.Stderr = &ffbuf
audio, err := youtube.StdoutPipe()
if err != nil {
log.Printf("pipeThruFfmpegToMp3: %v\n", err)
return err
}
ffmpeg.Stdin = audio
ffmpeg.Stdout = rw
// Headers sent, no turning back now
rw.Header().Set("Content-Type", "audio/mpeg")
rw.Header().Set("Content-Disposition", fmt.Sprintf("attachment;filename=\"%s.mp3\"", vi.GetSlug()))
rw.Flush()
youtube.Start() …Run Code Online (Sandbox Code Playgroud)