被杀死后会使用相同的pid吗?

Ram*_*esh 6 process vim

我使用vim编辑器打开了一个文件。这是在一个ssh会话中,由于我闲置了很长时间,会话关闭了,我不得不再次建立连接。我使用vim编辑器再次打开文件,它报告我说,

E325: ATTENTION
Found a swap file by the name ".latest2.sh.swp"
          owned by: ramesh   dated: Sun May 11 11:54:08 2014
         file name: ~ramesh/latest2.sh
          modified: no
         user name: ramesh   host name: xxx.xxx.edu
        process ID: 1466 (still running)
While opening file "latest2.sh"
Run Code Online (Sandbox Code Playgroud)

由于我没有对文件进行太多更改,所以我做了,

kill -9 1466
Run Code Online (Sandbox Code Playgroud)

我检查了这个过程是否消失了,

ps -aef | grep ramesh
Run Code Online (Sandbox Code Playgroud)

PID 1466是不存在。现在,当我再次打开文件时,它给了我同样的信息,

E325: ATTENTION
Found a swap file by the name ".latest2.sh.swp"
          owned by: ramesh   dated: Sun May 11 11:54:08 2014
         file name: ~ramesh/latest2.sh
          modified: no
         user name: ramesh   host name: xxx.xxx.edu
        process ID: 1466
While opening file "latest2.sh"
Run Code Online (Sandbox Code Playgroud)

但是,该进程并未处于仍在运行状态。

现在,我有一个关于PID使用的问题。根据维基百科条目,

在 Unix 下,进程 ID 通常是按顺序分配的,从 0 开始并上升到最大值,该值因系统而异。一旦达到此限制,分配将从零重新开始并再次增加。但是,对于本次和后续的传递,仍然分配给进程的任何 PID 都将被跳过。

现在,假设我已经用完了所有可用的 PID,是否会使用跳过PID 1466

因为,我已经杀死了它,我认为它应该被使用。但是,在我第二次尝试打开文件时,我仍然看到PID 1466

在这种情况下会发生什么?

phe*_*mer 10

是的,PID 可以随时重复使用。

您在该输出中看到的是,创建该.swp文件的进程是1466. 这并不一定意味着该过程仍然存在。
请记住,文件是静态的,它不会因为打开它的进程死亡而改变。因此,如果 1466 被杀死,该文件仍包含“我正在被 PID 1466 编辑”的信息。VIM 检查此进程是否还活着,并将其指示为(still running).

如前所述,另一个进程有可能获得完全相同的 PID。当报告为 时(still running),VIM 实际上不会检查该 PID 是否是 VIM 进程。

E325: ATTENTION
Found a swap file by the name ".test.swp"
          owned by: root   dated: Sun May 11 17:04:36 2014
         file name: /tmp/test
          modified: no
         user name: root   host name: whistler
        process ID: 21824 (still running)
While opening file "test"
             dated: Sun May 11 17:04:36 2014
Run Code Online (Sandbox Code Playgroud)

在这种情况下,PID 21824 是我启动的一个 shell。  

phemmer  21824  19   0  0.0  0.0 S+         00:53 bash -c [[ "$$" == 21824 ]] && echo MATCH && sleep 999999
Run Code Online (Sandbox Code Playgroud)

  • @hjk 我只是做了`while true; do bash -c '[["$$" == 21824 ]] && echo MATCH && sleep 999999'; done`,然后在获得 pid 后启动 vim。 (2认同)