我一直想知道是否有Unix命令这不会造成任何系统 称呼。例如,如果我们考虑ls
它还使用了很多系统调用,例如open
, read
,write
。我们使用strace
命令来查找这些调用。
答案1
/bin/true
并且/bin/false
不必进行除所需之外的任何系统调用exit(2)
。 (GNU true 和 false 是动态链接的 ELF 可执行文件,因此您当然会得到通常的样板启动)。
如果您在 asm 中编写一个程序,尝试从 中返回_start
,或者只是继续执行,则当执行跳转到未映射的页面时,它将出现段错误。所以你从技术上来说能避免打电话exit()
,但这不值得。 :P
您可能已经读到,最简单的实现true(1)
是一个空文件。这只在从 shell 调用时才有效。
touch true
chmod 755 true
./true
echo $?
0
strace ./true
write(2, "strace: exec: Exec format error\n", 32) = 32
exit_group(1)
如果您想制作自己的最小true
实现,那么在 amd64 上您可以执行以下操作:
cat > exit64.s <<EOF
.section .text
.globl _start
_start:
xor %edi, %edi
mov $231, %eax # exit(0)
syscall
# movl $1,%eax # 32bit int80 can call the 32bit ABI system calls from long mode
# int $0x80
EOF
as exit64.s -o exit64.o && ld exit64.o -o exit64
strace ./exit64
execve("./exit64", ["./exit64"], [/* 69 vars */]) = 0
exit_group(0) = ?
+++ exited with 0 +++
file exit64
exit64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
与 GNU 不同true
,这个不支持--help
and --version
! (例如command true --version
跳过 shell 内置的。)
也可以看看关于为 Linux 创建真正的小型 ELF 可执行文件的旋风教程如果你认为这很整洁。
答案2
不。
您始终可以编写这样的命令,但它不需要输入,也不会产生输出。甚至sleep(1)
不得不使用系统调用来检测时间的流逝。
编辑:一个纯汇编程序,除了尝试写入禁止的内存之外什么都不做,从而以 终止SIGSEGV
。