为什么“watch”命令会启动两个“watch”和一个“sh”进程?

为什么“watch”命令会启动两个“watch”和一个“sh”进程?

当我尝试运行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 命令源代码

  1. 您可以看到两个watch过程,因为watch 叉子(第 380 行)每次运行命令时都会创建一个新进程:

    在此处输入图片描述

  2. 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.

相关内容