Unix - 管道 ls - la |与 shell 相比,更少的 C 可执行文件提供了两倍的总文件大小

Unix - pipeline ls - la | less C executable giving double total file size vs shell

*编辑 - 斯蒂芬在下面的评论中回答了这个问题 *

所以基本上我已经创建了两个单独的子进程(使用两个单独的方法和它们自己的 fork)来执行命令 ls -la |减少使用管道。

第一个执行 ls 是这样的:

execl("/bin/ls", "ls", "-la", NULL);

第二个子进程少执行是这样的:

execlp("less", "less", NULL);

结果很好..除了一小部分:

使用 shell 命令的结果:

total 15
drwxr-xr-x 2 daniel staff 4 2015-02-27 18:58 .
drwxr-xr-x 15 daniel staff 24 2015-02-27 18:58 ..
-rwxr-xr-x 1 daniel staff 9280 2015-02-27 18:58 pipes
-rw-r--r-- 1 daniel staff 1419 2015-02-27 18:58 pipes.c

使用我的可执行文件的结果:

total 30
drwxr-xr-x 2 daniel staff 4 Feb 27 18:58 .
drwxr-xr-x 15 daniel staff 24 Feb 27 18:58 ..
-rwxr-xr-x 1 daniel staff 9280 Feb 27 18:58 pipes
-rw-r--r-- 1 daniel staff 1419 Feb 27 18:58 pipes.c

现在日期是我不关心的不同格式.. 但总大小是我的可执行文件的两倍(30 对 15)。为什么会这样?

This 答案表明 POSIX 和 GNU 工具在用于计算总数的块大小上有所不同。尝试将 h 添加到您的命令并比较结果(此标志使单位明确)。我的猜测是这些进程的执行环境干扰了结果。例如,它可能与您 运行 不同 ls

确保您在 shell 中 运行ning 的 ls 和程序中 运行ning 的 ls 相同程序。

您的程序将 /bin/ls 指定为 运行 的程序;当您在 shell 提示符下使用 shell 命令 which ls 键入命令时,您可以找出 运行 是什么(另请参阅 type ls)。

如果这些不同,可能是由于 POSIX 与总大小计算中使用的 GNU 块大小有关。