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

Dee*_*ngh 0 shell-script command

我一直想知道是否有任何不进行任何系统调用的Unix 命令。例如,如果我们考虑实例,它也会使用很多系统调用,例如, ,。我们使用该 命令来查找这些调用。 lsopenreadwritestrace

Pet*_*des 5

/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)
Run Code Online (Sandbox Code Playgroud)

如果您想制作自己的最小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
Run Code Online (Sandbox Code Playgroud)

与 GNU 不同true,这个不支持--help--version! (例如command true --version跳过shell内置。)

如果您认为这很简洁,另请参阅关于为 Linux 创建真正小巧的 ELF 可执行文件的旋风教程