“ echo&”命令给出的进程号是多少?

时间:2018-12-21 23:51:36

标签: bash shell

每次我跑步

echo &

...返回了不同的“进程号”或PID。

这些是做什么用的?为什么每次都不一样?

2 个答案:

答案 0 :(得分:1)

& fork()关闭了外壳程序的新副本(如果运行的是外部程序,则使用execve()将外壳程序的副本替换为外部程序,但是{{ 1}}不是外部的。因此,当您运行echo时,您将创建一个shell副本作为一个新进程。它运行echo &,然后退出。

每次在UNIX上启动一个新进程时(通过echofork()一个现有进程的发生),该新进程都会获得一个进程ID号作为查找表中的一项操作系统用来引用正在运行的程序;这就是您在这里看到的。

进程ID是程序标识其他程序的句柄,包括向其他程序发送信号或检查它们的状态(例如,查看程序是否仍在运行;或者,如果退出,则查找怎么死了)。请参阅waitpid()kill(),以获取需要提供PID才能进行操作的系统调用(操作系统级请求)的示例。

PID的分配方式可以避免频繁地重复使用-这样一来,您就不太可能因clone()信号而意外打错程序(如果您打算定位的程序已经退出,并且之后又有其他事情开始了。

答案 1 :(得分:0)

这是一个非常非常简单的解释。

shell使用户可以键入命令以执行有用的操作。用户键入一个命令,按Enter键,该命令被执行,用户看到发生了什么,然后可以从另一个命令重新开始。

之所以会这样,是因为外壳程序在被指示执行命令时会启动命令并等待以使其终止。即使向Shell提供了要执行的命令列表(这种命令列表位于文件中,并且称为 script ),也是这样。

有些命令无意向用户提供有用的输出(例如,守护程序:它们无需用户干预即可实现功能)。或者还有其他原因/情况……用户想要执行命令而无需等待以完成命令;如果是守护程序,它们实际上是永远不会自行终止。

如果用户要运行命令,但在命令运行时能够与外壳进行交互,则可以在命令行上添加与号。 “与”号表示“在一起”,它告诉Shell放空该命令,但等待其终止-Shell与调用的命令同时工作 together (这并不意味着他们合作,事实上,他们不这样做。

此时,用户知道他启动了一个正在运行的进程。但是,如果用户过了一会儿决定对该流程有所作为怎么办?他如何解决这个精确的过程,而不是另一个不同的过程?这就是外壳程序打印出刚调用的进程的进程ID(PID)的原因:用户知道哪个是他启动的进程。

查尔斯的答复很好地解释了OP每次看到不同数字的原因。当进程终止时,不再使用其PID,但是系统会尝试一段时间不(重新)使用相同的PID,因为系统中的某些人(或某人)仍会认为该进程仍在运行,并尝试执行以下操作:杀死它或其他:试图杀死一个进程并不是很好,因为系统已经用另一个进程代替了该进程...