可以通过strace -o ls.txt ls进行查看:

open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3 ///打开当前目录这个文件(目录是一种特殊的文件),并返回文件句柄3
fstat64(3, {st_mode=S_IFDIR|0755, st_size=4096, }) = 0   ///取得当前目录文件的属性,比如这里大小为4096
fcntl64(3, F_GETFD)   = 0x1 (flags FD_CLOEXEC)
getdents64(3, /* 33 entries */, 4096) = 1104     ///读取当前目录下的文件
getdents64(3, /* 0 entries */, 4096)  = 0
close(3)                        = 0        ///关闭当前目录文件的句柄
。。。

通过# cat ls.txt | awk -F '(' {'print $1'} | sort | uniq 可以看到所有的命令
access
arch_prctl
brk
close
execve
exit_group
fstat
futex
getdents
getrlimit
ioctl
mmap
mprotect
munmap
open
openat
read
rt_sigaction
rt_sigprocmask
set_robust_list
set_tid_address
statfs
write


shell命令执行机制就是 fork+exec 执行命令,虽然用strace查看引起的系统调用没有fork,不过我想是因为执行任何一个shell命令都会调用fork,所以它就没写了。。。。。
Logo

更多推荐