当我尝试运行watch ps
命令时,我得到了以下结果:
Every 2.0s: ps Thu Jul 31 14:06:45 2014
PID TTY TIME CMD
4329 pts/1 00:00:00 bash
4380 pts/1 00:00:00 watch
4381 pts/1 00:00:00 watch
4382 pts/1 00:00:00 sh
4383 pts/1 00:00:00 ps
为什么此命令启动两个watch
进程而不是一个?
另外,为什么 watch 会启动一个实例sh
?
答案1
为了找到答案,我们需要查看 watch 命令源代码。
您可以看到两个
watch
过程,因为watch
叉子(第 380 行)每次运行命令时都会创建一个新进程:sh
这里需要额外的过程,watch
因为系统()函数(第 399 行),默认情况下,它会使用 运行指定的命令/bin/sh -c
。查看system
手册页:
NAME system - execute a shell command SYNOPSIS #include <stdlib.h> int system(const char *command); DESCRIPTION system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed. During exe‐ cution of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT will be ignored.