当前位置 : 首页 » 互动问答 » 正文

如何在OCaml的stderr和stdout中捕获子进程输出

分类 : 互动问答 | 发布时间 : 2018-04-27 15:25:17 | 评论 : 1 | 浏览 : 38 | 喜欢 : 0

我正在查看下面的OCaml代码,它试图打开一个子进程,为它提供一些输入,然后收集它在stdout或stderr上产生的所有输出。但事实上,它首先从stdout中读取所有内容,然后从stderr中读取所有内容,这看起来很诡异 - 如果子进程发生大量内容写入stderr,看起来结果会是死锁。let not rec output_lines(输出:字符串列表)(chan:out_channel):unit =   忽略(List.map(output_string chan)输出);冲洗陈 让async_command     (名称:字符串)     (参数:字符串列表)   :( in_channel * out_channel * in_channel)=   Unix.open_process_full     (name ^“”^(String.concat“”arguments))     (Unix.environment()) 让sync_command     (名称:字符串)     (参数:字符串列表)     (输入:字符串列表):(字符串列表*字符串列表)=   让(o,i,e)= async_command命名参数   output_lines输入i;   让出,err =(input_lines o,input_lines e)​​in   让status = Unix.close_process_full(o,i,e)in   开始比赛状态     | Unix.WEXITED x - >如果x!= 0,则引发(Shell_error(unlines err))     | Unix.WSIGNALED x - > if x = Sys.sigint然后引发Sys.Break     | Unix.WSTOPPED x - > if x = Sys.sigint然后引发Sys.Break   结束;   (out,err)

这应该如何解决? (更好的是,我应该在哪些库已经实现了这个功能?)

How should this be fixed? (Better yet, what library should I use where this functionality is already implemented?)

回答(1)

相关阅读: