Linux shell是否执行fork / exec然后waitpid()获取返回代码以填充$?变量,每次执行某事?
答案 0 :(得分:3)
是的,这正是它的作用。
如果您感兴趣,可以通过在command: guessit -j "Агенты А.Н.К.Л. (The Man from U.N.C.L.E.).2015.WEB-DLRip.mp4"
Traceback (most recent call last):
File "D:\Soft\Python27\Scripts\guessit-script.py", line 9, in <module>
load_entry_point('guessit==2.0b3', 'console_scripts', 'guessit')()
File "build\bdist.win32\egg\guessit\__main__.py", line 150, in main
File "build\bdist.win32\egg\guessit\__main__.py", line 40, in guess_filename
UnicodeEncodeError: 'ascii' codec can't encode characters in position 11-16: ordinal not in range(128)
下运行shell来获取此信息(一种拦截并打印程序所有系统调用的工具)。
strace
这给出了以下输出,修剪得很多:
strace bash -c '/usr/bin/ls > /dev/null; echo $?'
我使用了一个包含两个命令的bash脚本,因为否则bash不会fork,而只是执行命令,替换它自己(我发现它有用的优化!)
在输出中,execve("/usr/bin/bash", ["bash", "-c", "/usr/bin/ls > /dev/null; echo $?"], [/* 58 vars */]) = 0
[....]
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff16c3d69d0) = 1189
[....]
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 1189
[....]
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=1189, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
wait4(-1, 0x7ffd3096b290, WNOHANG, NULL) = -1 ECHILD (No child processes)
[....]
exit_group(0) = ?
+++ exited with 0 +++
是clone
函数后面的系统调用,同样fork
由wait4
调用。您没有看到waitpid
,因为在子进程中发生了这种情况,我们没有要求exec
跟踪。如果您添加strace
,它会这样做,但也会跟踪-f
进程的内容。