我有Bash的问题,我不知道为什么.
在shell下,我输入:
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是不同的,是不是?
'$$'就像宏?
你能帮助我吗?
$$
被定义为在子shell中返回父进程的进程ID; 从"特殊参数"下的手册页:
$扩展为shell的进程ID.在()子shell中,它扩展为当前shell的进程ID,而不是子shell.
在bash
4中,您可以获取子项的进程ID BASHPID
.
~ $ echo $$ 17601 ~ $ ( echo $$; echo $BASHPID ) 17601 17634
您可以使用以下之一.
$!
是最后一个后台进程的PID.
kill -0 $PID
检查它是否仍在运行.
$$
是当前shell的PID.
括号在Bash中调用子shell.由于它只是一个子shell,它可能具有相同的PID - 取决于实现.
您调用的C程序是一个单独的进程,它有自己唯一的PID - 如果它在子shell中则无关紧要.
$$
是Bash中当前脚本PID的别名.见之间的差异$$
,并$BASHPID
在这里,和正上方的额外变量$BASH_SUBSHELL
包含嵌套级别.