libuv在守护进程中因关闭标准输入输出触发断言失败的问题及解决方案咨询
libuv在守护进程中因关闭标准输入输出触发断言失败的问题及解决方案咨询
最近碰到个棘手的问题,想跟大家请教下:
我们的守护进程按照标准流程执行了fclose(stdin); fclose(stdout);,之后调用/usr/bin/host这个DNS工具解析主机名,而这个工具内部会调用libuv库,结果直接触发断言失败导致程序崩溃,错误信息如下:
"host: ./src/unix/core.c:602: uv__close: Assertion `fd > STDERR_FILENO' failed."
具体操作流程是这样的:
- 守护进程中关闭了stdin和stdout
- 触发需要用到libuv的操作时,就出现了上面的断言错误,看起来libuv期望stdin和stdout保持打开状态
补充下背景:这段代码在Ubuntu 24之前运行完全正常,升级到Ubuntu 24后,系统里装的是libuv1t64 v1.48版本,就出现了这个问题。
现在我有两个关于解决方案的疑问,想听听大家的看法:
- 能不能直接把守护进程里关闭stdin和stdout的代码注释掉?这么做会有什么潜在的后果吗?
- 能不能用
dup2()把stdin和stdout重定向到/dev/null?这么做会有什么后果?如果后续...
备注:内容来源于stack exchange,提问作者Mohammed Harmain
相关产品推荐
相关产品推荐

