创建守护进程时,通过脚本调用udevadm control --reload-rules命令会出现core-dump

创建守护进程daemon,常规的会把所有文件描述符都关掉,然后让守护进程去跑目标代码段。
在欧拉20-3 x86上,创建守护进程之后调用含特定命令脚本会必现core-dump。
我已经定位到原因是脚本中执行了udevadm control --reload-rules,其他的命令不会引起,并且和守护进程也没有必然联系,只是因为关闭了标准输入描述符0,由此我编辑了复现代码preset.c,主函数如下1图


执行的脚本如2图
屏幕截图 2023-03-10 175928
执行结果如3图

会生成core-dump文件
虽然我定位到了这个直接原因是因为close(0),但我依然不理解为什么这样操作会引起core-dump,调用shell脚本时不是应该会默认有自己shell进程的标准输入输出吗,如何会依赖前面进程的0文件描述符。————————并且centos上跑同样的守护进程调用该命令是不会出现coredump的,我也尝试查看了欧拉systemd源码中udevadm的部分,未发现与centos有什么差别,所以希望开发欧拉系统的高手能解答

1 个赞