ls
具有atexit (close_stdout);
作为其初始化代码。当它完成,它关闭标准输出(即close(1)
),所以你的cout
,printf
或者write(1, ...
操作不会显示任何信息。这并不意味着不调用析构函数。您可以通过在析构函数中创建一个新文件来验证这一点。
http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c#n1285这是GNU coreutils ls中的一行。
不仅如此ls
,大多数coreutils都这样做。不幸的是,我不知道确切的原因 ,为什么 他们宁愿将其关闭。
关于如何找到(或至少我所做的)的旁注-下次或使用无源代码访问的程序可能会有所帮助:
析构函数消息使用/bin/true
(我想到的最简单的程序)打印,但不使用ls
或打印df
。我开始strace /bin/true
和strace /bin/ls
比较最新的系统调用。它显示close(1)
和close(2)
为ls
,但没有进行true
。之后事情开始变得有意义,我只需要验证析构函数已被调用即可。