【发布时间】:2014-01-30 13:46:49
【问题描述】:
我在使用 Bash 时遇到问题,我不知道为什么。
在shell下,我输入:
echo $$ ## print 2433
(echo $$) ## also print 2433
(./getpid) ## print 2602
“getpid”是一个获取当前pid的C程序,如:
int main() { printf("%d", (int)getpid()); return 0; }
让我困惑的是:
- 我认为“(command)”是一个子进程(对吗?),我认为它的 pid 应该与它的父 pid 不同,但它们是相同的,为什么......
- 当我使用我的程序在括号之间显示 pid 时,它显示的 pid 是不同的,对吗?
- '$$' 是不是类似于宏?
你能帮帮我吗?
【问题讨论】:
-
请注意,
getpid会显示不同的进程 ID,即使它没有在子 shell 中运行。 -
@Marian
echo $$ $BASHPID ; ( echo $$ $BASHPID )证明确实如此。圆括号创建一个子外壳。这些语句可能会更改变量值,并且父 shell 不能看到这些更改。这是作为fork()操作实现的。