‘logcat’命令似乎适用于Android开发 – 这可能解释了命令的奇怪位置.
必须修复的关键操作是确保关闭当前标准输入(终端)并打开输入设备的/ dev / null /:
close(0);
if ((fd = open("/dev/null", O_RDONLY)) != 0)
...error - failed to open /dev/null!
这意味着您的守护进程子进程将不会从终端读取任何内容.
我认为你想做的是:
>从命令行运行启动程序,命令行将标准输入,标准输出和标准错误连接到“终端”.
>在程序内部,您希望替换标准输入,使其来自/ dev / null.
>您希望单独保留标准输出 – 您希望logcat写入当前标准输出.
>您可能也想单独留下标准错误.
在程序中的某个时刻,你正确地做你的daemonization(从@ bstpierre的答案借用链接),确保你所连接的终端不是你的控制终端,这样发送到终端的中断和挂断不会影响你的守护进程.管道比您设置的更简单 – 您应该处理标准输入并保持标准输出和标准错误不变(而不是更改输出并保持输入不变).
现在,您可能希望输出转到/ dev / console;如果是这样,那么修改代码以打开/ dev / console是合理的.但是,如果无法打开/ dev / console,则退回/ dev / null是不合理的;你的程序应该报告错误并失败(因为将logcat写入/ dev / null没有意义!).确保使用O_NOCTTY标志打开控制台,这样它就不会成为守护程序的控制终端.
我最后的评论是:
>您确定要在其他用途中使用随机文本显示在终端或控制台上吗?
当发生这种情况时,我不太喜欢它.