相关疑难解决方法(0)

如何防止SIGPIPE(或正确处理它们)

我有一个小型服务器程序,它接受TCP或本地UNIX套接字上的连接,读取一个简单的命令,并根据命令发送一个回复.问题是客户端有时可能对答案没兴趣并且提前退出,因此写入该套接字将导致SIGPIPE并使我的服务器崩溃.什么是防止崩溃的最佳做法?有没有办法检查线的另一边是否还在读?(select()似乎在这里不起作用,因为它总是说套接字是可写的).或者我应该用处理程序捕获SIGPIPE并忽略它?

c io signals sigpipe broken-pipe

242
推荐指数
8
解决办法
19万
查看次数

信号是什么(SIGPIPE,SIG_IGN); 做?

我所知道的个人用途SIGPIPESIGIGN.

是什么

signal(SIGPIPE, SIG_IGN);
Run Code Online (Sandbox Code Playgroud)

到底怎么办?

c unix signals

6
推荐指数
1
解决办法
7287
查看次数

管道输入出错时如何让程序返回

我目前有这个功能,它通过 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)

go

5
推荐指数
1
解决办法
257
查看次数

标签 统计

c ×2

signals ×2

broken-pipe ×1

go ×1

io ×1

sigpipe ×1

unix ×1