得到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; }
令我困惑的是:
- 我认为“(命令)”是一个子过程(我是对吗?),我认为它的pid应该和它的父pid不同,但它们是一样的,为什么…
- 当我使用我的程序在括号之间显示pid时,它显示的pid是不同的,是不是?
- “$$”就像macros?
你可以帮我吗?
$$
定义为返回子shell中父进程的进程ID; 从“特殊参数”下的手册页:
$扩展到shell的进程ID。 在()子shell中,它展开为当前shell的进程ID,而不是子shell。
在bash
4中,你可以用BASHPID
获得subprocess的ID。
~ $ echo $$ 17601 ~ $ ( echo $$; echo $BASHPID ) 17601 17634
您可以使用下列之一。
-
$!
是最后一个后台进程的PID。 -
kill -0 $PID
检查它是否仍在运行。 -
$$
是当前shell的PID。
- 圆括号在Bash中调用子shell 。 由于它只是一个子shell,它可能有相同的PID – 取决于实现。
- 你调用的C程序是一个独立的进程,它有自己独特的PID – 不pipe它是否在一个子shell中。
-
$$
是Bash中当前脚本PID的别名。 在这里查看$$
和$BASHPID
之间的差异 ,并在其上面添加包含嵌套级别的附加variables$BASH_SUBSHELL
。
如果你想让你的C程序打印你的shell的PID,试试getppid()
。