- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是Linux的初学者,只是对工作和流程组有一些疑问。
我的教科书说:“ Unix外壳程序使用作业的抽象来表示由于评估单个命令行而创建的进程。在任何时间点,最多有一个前台作业和零个或多个后台作业。
可以说我们有这个简单的shell代码(我省略了一些不重要的代码,例如setup argv等):
当我们输入第一个命令时,例如:./exampleProgram &
Q1-是否创造工作?如果是,工作包含什么过程?
调用shellex.c的main(),因此在执行第15行时:fork()创建一个新的子进程,假设父进程为p1,而新创建的子进程为c1
如果是后台作业,那么我们可以在提示符下键入另一个命令./anotherProgram &
并输入enter
Q2-我很确定,现在它只是p1和c1,而p1在执行第15行时再次执行第二条命令:fork(),
我们有p1,c1和新创建的c2,我的理解正确吗?
Q3-有几份工作?仅仅是包含p1,c1和c2的一项工作吗?
Q4-如果它只是一项工作,那么当我们继续键入新命令时,我们将只有一个工作包含一个父进程p1和许多子进程c1,c2,c3,c4 ...
那么为什么我的教科书上说壳牌可以做多个工作呢?以及为什么最多有一个前台作业和零个或多个后台作业。
最佳答案
关于这个话题,有很多话要说,其中一些可以作为答案,而大多数都需要进一步阅读。
对于第一季度,我从概念上说是的,但是作业不是自动的,作业跟踪和控制也不是不可思议的。我在您显示的代码片段中看不到任何逻辑,例如建立并维护一个工作表。我了解这只是一个示例,因此工作控制逻辑可能在其他地方。作业控制是常见的现有Unix Shell的功能,但是如果人们从头开始编写新的Unix Shell,则需要添加作业控制功能作为代码/逻辑。
对于第二季度,您所说的方式不是我所说的。在第一次调用fork()
之后,是的,有一个p1和一个c1,但是首先要认识到p1和c1是同一程序(shellex
)的不同实例。仅在execve()
的调用正在运行之后。 exampleProgram
创建fork()
的子实例,并且shellex
导致execve()
的子实例被shellex
替换(在RAM中)(假定为exampleProgram
的值)。
父母在“处死”孩子方面没有真正意义,在argv[0]
上替换孩子的过程没有真正意义,只是为了让他们前进。父级启动子级,并可能等待子级执行完成,但实际上,父级及其子进程的整个层次结构都各自独立执行,由内核执行。
但是可以,如果告诉运行的程序应该在后台运行,则execve()
将接受进一步的输入,并且在下一次调用shellex
时,将有两个子进程的父fork()
。再次,首先,子c2将是shellex
的实例,可以通过shellex
快速替换为已命名的任何程序。
(关于在后台运行,execve()
是否具有这种效果取决于示例代码中名为&
的函数内部的逻辑。我熟悉的Shell使用parseline()
表示“在后台运行“,但这并没有什么特别的或不可思议的。新编写的Unix shell可以以其他方式做到这一点,即尾随&
或前导+
或shell作者决定执行的任何操作。
对于Q3和Q4,首先要认识到的是,您正在调用BG:
的父级是您所显示的Shell程序。因此,不,p1
不会成为工作的一部分。
在Unix中,作业是作为单个管道的一部分执行的进程的集合。因此,一项工作可以包含一个或多个过程。此类进程仍附加到运行它们的终端,但可能在前台(正在运行和交互式),已挂起或在后台(正在运行而不是交互式)。
one process, foreground : ls -lR
one process, background : ls -lR &
one process, background : ls -lR, then CTRL-Z, then bg
many processes, foreground : ls -lR | grep perl | sed 's/^.*\.//'
many processes, background : ls -lR | grep perl | sed 's/^.*\.//' &
p1
为您显示进程ID和进程组ID。例如,在我的Mac版本的bash上,这是:
$ ls -lR | grep perl | sed 's/^.*\.//' &
[1] 2454 <-- job 1, PID of the sed is 2454
$ ps -o command,pid,pgid
COMMAND PID PGID
vim 2450 2450 <-- running in a different tab
ls -lR 2452 2452 }
grep perl 2453 2452 }-- 3 PIDs, 1 PGID
sed s/^.*\.// 2454 2452 }
ps
启动子进程,但随后退出,仅使子级运行,并且现在具有父级PID1。子级关闭
fork()
,
stdin
和< cc>,因为它们没有意义,因为守护程序运行“无头”。
stdout
ing(前台子程序)或不运行
stderr
ing(后台子程序),并且子级通常保留使用
wait()
,
wait()
和
stdin
(尽管它们可能会重定向到文件等)
stdout
自己的子进程,依此类推。因此,流程的层次结构会变得很深。如果没有其他特定操作,子进程将与其父进程位于同一进程组中。
关于linux - 我如何在Linux中对Shell进行多项工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53331232/
我相信我在子 shell 中调用 exit 会导致我的程序继续: #!/bin/bash grep str file | while read line do exit 0 done
我相信我在子 shell 中调用 exit 会导致我的程序继续: #!/bin/bash grep str file | while read line do exit 0 done
我有几个脚本,它们的第一部分看起来是一样的。这部分的功能是识别脚本在哪台机器上运行并相应地设置几个变量。它看起来像这样: ENV=`echo $LOGNAME | cut -c1-8` if
这是我正在尝试做的事情。我有 4 个 shell 脚本。脚本 1 需要先运行,然后是 2,然后是 3,然后是 4,并且它们必须按此顺序运行。脚本 1 需要运行(并在后台等待)2 才能正常运行,但是脚本
我有一个名为 a.sh 的脚本,其中的内容是: //a.sh: #!/bin/bash temp=0 while [ "$temp" -ne 500 ] do echo `date`
在snakemake中,使用shell()函数执行多个命令的推荐方式是什么? 最佳答案 您可以调用shell()多次内run规则块(规则可以指定 run: 而不是 shell: ): rule pro
我有一个 shell 脚本,我向其中传递了一些参数。Test1.sh -a 1 -b 2 -c“一二三” 在 Test1.sh 中,我按以下方式调用另一个 shell 脚本。Test2.sh $* 我
我有 2 个 shell 脚本。 第二个shell脚本包含以下函数第二个.sh func1 func2 first.sh 将使用一些参数调用第二个 shell 脚本, 将使用特定于该函数的一些其他参数
我有一个 Unix shell 脚本 test.sh。在脚本中,我想调用另一个 shell,然后从子 shell 执行 shell 脚本中的其余命令并退出 说清楚: test.sh #! /bin/b
我想在 shell 脚本中更改路径环境变量。路径变量需要在shell脚本执行后修改。 最佳答案 我知道有两种方法可以做到这一点。第一种是在当前 shell 的上下文中运行脚本: . myscript.
此 shell 脚本按预期运行。 trap 'echo exit' EXIT foo() { exit } echo begin foo echo end 这是输出。 $ sh foo.sh
我正在使用 vimshell在 vim 中执行命令 nnoremap vs :VimShellPop 使用此键映射,我可以打开 vim shell 并执行诸如“捆绑安装”之类的命令,然后 输入 exi
我想连接到不同的 shell(csh、ksh 等)并在每个切换的 shell 中执行命令。 下面是反射(reflect)我的意图的示例程序: #!/bin/bash echo $SHELL csh e
我目前正在尝试使用 BNF 和 LL 解析器在 C 中重新编写 shell。 否则,我需要知道 shell 运算符的优先级是什么| , > , > , & , ; ? 有没有人可以提供给我? 谢谢 最
不幸的是,我没有suspend 命令(busybox/ash)。但是我可以使用 kill -STOP $$ 从后台 shell (sh &) 返回到父 shell(以及 fg 之后)。 但是我不想输入
我需要知道,当用户切换到另一个 shell 时,通过单击它。 我试过 shellListener.shellDeactivated()但是当 shell 失去对它自己的控件的焦点时,会触发此事件,这意
file1.txt aaaa bbbb cccc dddd eeee file2.txt DDDD cccc aaaa 结果 bbbb eeee 如果能不区分大小写就更好了! 谢谢! 最佳答案 gre
我见过解压缩目录中所有 zip 文件的循环。但是,在运行此之前,我宁愿确保我将要运行的内容正常工作: for i in dir; do cd $i; unzip '*.zip'; rm -rf *.z
我对编程还很陌生,但我想知道 vim、emacs、nano 等 shell 文本编辑器如何能够控制命令行窗口。我主要是一名 Windows 程序员,所以可能在 *nix 上有所不同。据我所知,只能将文
我有一个包含第 7 列日期的文件,我的要求是将它与今天的日期进行比较,如果小于它,则删除该完整行。 此外,如果第 7 列中提到的任何日期超过 15 天,则将其修改为最多 15 天 下面的例子- now
我是一名优秀的程序员,十分优秀!