我有Bash的问题,但不知道原因。
在shell下,我输入了:
echo $$ ## print 2433
(echo $$) ## also print 2433
(./getpid) ## print 2602
这里的 getpid
是一个 C 程序,用于获取当前进程的 pid,例如:
int main() {
printf("%d", (int)getpid());
return 0;
}
使我困惑的是:
- 我认为“(命令)”是一个子进程(我对吗?),我认为它的pid应该与它的父pid不同,但它们是相同的,为什么...
- 当我使用我的程序在括号中显示pid时,它显示的pid不同,这是正确的吗?
$$
是类似于宏的东西吗?
getpid
也会显示不同的进程 ID。 - chepnerecho $$ $BASHPID ; ( echo $$ $BASHPID )
表明它是这样的。圆括号创建一个子shell。语句可能会更改变量的值,父shell不应该看到这些变化。这是通过fork()
操作实现的。 - Ben