有没有在执行时不进行任何系统调用的unix命令?

有没有在执行时不进行任何系统调用的unix命令?

我一直想知道是否有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,这个不支持--helpand --version! (例如command true --version跳过 shell 内置的。)

也可以看看关于为 Linux 创建真正的小型 ELF 可执行文件的旋风教程如果你认为这很整洁。

答案2

不。

您始终可以编写这样的命令,但它不需要输入,也不会产生输出。甚至sleep(1)不得不使用系统调用来检测时间的流逝。

编辑:一个纯汇编程序,除了尝试写入禁止的内存之外什么都不做,从而以 终止SIGSEGV

相关内容