zcb*_*zcb 4 unix linux shell command-prompt
问题是标题。我无法弄清楚为什么终端会在执行 'ls' 后立即关闭。一个 Linux shell 是这样的:
1.while (1) {
2. char *cmd = read_command();
3. int child_pid = fork();
4. if (child_pid == 0) {
5. exec(cmd);
6. }else {
7. waitpid(child_pid);
8. }
9.}
因此,如果我们在 shell 中运行 'exec ls',则 cmd 是一串 'exec ls'。在第 3 行 fork 一个子进程。在第 5 行,exec(cmd) 将替换子进程但不会影响父进程。如果父进程不受影响,那为什么终端会关闭呢?
请告诉我上面推理中的缺陷。
如果您运行ls,您的shell 进程将启动另一个进程来运行该ls程序,然后它将等待它完成。当它完成时,控制权返回给外壳。
使用exec ls,您实际上将当前进程中的 shell 程序替换为该ls程序,以便在它完成时,没有 shell 等待它。
最有可能的是,您将拥有一个终端程序或init作为父程序,这将在您的进程退出时接管。这就是您的外壳消失的原因,因为您明确告诉它。
有关(非执行)情况的解释,请参阅此答案shell/ls。
至于你的更新,外壳也并非总是创建一个单独的进程做的东西。有大量内部命令(例如cd或alias)不涉及进行其他进程(当然,这取决于您的 shell,但作为一个示例,您可以bash通过man bash-builtins在命令提示符处输入来查看内部命令)。
exec是其中之一。它只是用您指定的程序替换 shell 本身(即,不是分叉的子进程)。这就是为什么它不像你想的那样行事。