得到shell(bash)中的pid

我有Bash的问题,我不知道为什么。
shell下,我input:

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. “$$”就像macros?

你可以帮我吗?

Solutions Collecting From Web of "得到shell(bash)中的pid"

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

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

bash 4中,你可以用BASHPID获得子进程的ID。

 ~ $ echo $$ 17601 ~ $ ( echo $$; echo $BASHPID ) 17601 17634 

您可以使用下列之一。

  • $! 是最后一个后台进程的PID。
  • kill -0 $PID检查它是否仍在运行。
  • $$是当前shell的PID。
  1. 圆括号在Bash中调用子shell 。 由于它只是一个子shell,它可能有相同的PID – 取决于实现。
  2. 你调用的C程序是一个独立的进程,它有自己独特的PID – 不管它是否在一个子shell中。
  3. $$是Bash中当前脚本PID的别名。 在这里查看$$$BASHPID之间的差异 ,并在其上面添加包含嵌套级别的附加变量$BASH_SUBSHELL

如果你想让你的C程序打印你的shell的PID,试试getppid()