181

我对 Bash 有疑问,我不知道为什么。
在 shell 下,我输入:

echo $$    ## print 2433
(echo $$)  ## also print 2433
(./getpid) ## print 2602

“getpid”是一个获取当前 pid 的 C 程序,例如:

   int main() {
    printf("%d", (int)getpid());
    return 0;
   }

让我困惑的是:

  1. 我认为“(命令)”是一个子进程(我对吗?),我认为它的 pid 应该与其父 pid 不同,但它们是相同的,为什么......
  2. 当我使用我的程序在括号之间显示 pid 时,它显示的 pid 是不同的,对吗?
  3. '$$' 是宏之类的东西吗?

你能帮助我吗?

4

7 回答 7

243

$$定义为在子shell中返回父进程ID;从“特殊参数”下的手册页中:

$ 扩展为 shell 的进程 ID。在 () 子shell 中,它扩展为当前shell 的进程ID,而不是子shell。

bash4、可以通过 获取子进程ID BASHPID

~ $ echo $$
17601
~ $ ( echo $$; echo $BASHPID )
17601
17634
于 2014-01-11T15:04:05.540 回答
85

您可以使用以下方法之一。

  • $!是最后一个后台进程的 PID。
  • kill -0 $PID检查它是否仍在运行。
  • $$是当前 shell 的 PID。
于 2014-08-18T10:43:25.953 回答
27
  1. 括号调用Bash 中的子shell。由于它只是一个子外壳,它可能具有相同的 PID - 取决于实现。
  2. 您调用的 C 程序是一个单独的进程,它有自己唯一的 PID——不管它是否在子 shell 中。
  3. $$是 Bash 中当前脚本 PID的别名。请参见此处和 之间的差异,$$以及$BASHPID$BASH_SUBSHELL包含嵌套级别的附加变量的正上方。
于 2014-01-11T15:02:21.527 回答
8

getppid()如果您希望您的 C 程序打印您的 shell 的 PID,请尝试一下。

于 2014-01-11T15:08:15.110 回答
5

这是获得正确 pid 的一种通用方法

pid=$(cut -d' ' -f4 < /proc/self/stat)

同样不错的子工作

SUB(){
    pid=$(cut -d' ' -f4 < /proc/self/stat)
    echo "$$ != $pid"
}

echo "pid = $$"

(SUB)

检查输出

pid = 8099
8099 != 8100
于 2019-08-23T10:12:47.657 回答
2

如果您询问如何获取已知命令的 PID,它类似于以下内容:

如果你发出了下面的命令#发出的命令是 ***

dd if=/dev/diskx of=/dev/disky


然后你会使用:

PIDs=$(ps | grep dd | grep if | cut -b 1-5)

这里发生的是将所有需要的唯一字符通过管道传输到一个字段,并且该字段可以使用

回显 $PIDs

于 2018-07-18T23:15:04.713 回答
1

如果您想要一个简单的 shell 脚本来获取带有变量的最大 PID,请执行此操作

pid=$(cat /proc/sys/kernel/pid_max)
echo $pid

这将打印您的最大PID。

于 2021-04-03T08:31:08.367 回答