当我尝试
strace ping google.com
或者
strace ls
或者
even strace curl <domain>
前两个系统调用总是,
execve("/usr/bin/curl", ["curl", "google.com"], 0x7ffecf1bc378 /* 61 vars */) = 0
brk(NULL) = 0x55f553c49000
有人可以告诉我,当我执行任何操作时,execve 是否总是第一个系统调用?
我阅读了这个手册页,https://linux.die.net/man/2/execve
但不明白它execve
是否真的是系统调用或可执行程序?
在 Linux 中,通过 创建一个新进程
fork()
,它创建了一个与父进程几乎相同的子进程。要创建一个程序与原进程的程序不同的新进程,新的子进程立即调用execve()
,这基本上就是说“用这个其他程序替换我当前的程序”的进程。brk(NULL)
是询问其堆内存在哪里结束的进程。许多程序将此称为它们的第一个系统调用(将在 之后立即显示execve()
),因为它们malloc()
立即使用(或它们在内部使用的库调用malloc()
)。如果程序及其库调用暂时不需要调用malloc()
,那么除了brk(NULL)
第二个系统调用之外的东西。