得到pid in shell(bash)

时间:2014-01-11 14:57:46

标签: linux bash shell pid

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

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. 是'$$'就像宏?
  4. 你能帮帮我吗?

7 个答案:

答案 0 :(得分:168)

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

  

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

bash 4中,您可以使用BASHPID获取孩子的进程ID。

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

答案 1 :(得分:68)

您可以使用以下其中一项。

  • $!是最后一个后台进程的PID。
  • kill -0 $PID检查它是否仍在运行。
  • $$是当前shell的PID。

答案 2 :(得分:22)

  1. 括号调用subshell in Bash。由于它只是一个子shell,它可能具有相同的PID - 取决于实现。
  2. 您调用的C程序是一个单独的进程,它有自己唯一的PID - 如果它在子shell中则无关紧要。
  3. $$是Bash中the current script PID的别名。请参阅differences between $$ and $BASHPID here,以及包含嵌套级别的其他变量$BASH_SUBSHELL

答案 3 :(得分:4)

如果您希望C程序打印shell的PID,请尝试getppid()

答案 4 :(得分:1)

如果您询问如何获取已知命令的PID,它将类似于以下内容:

如果您已发出以下命令     #发出的命令是***

  

dd if = / dev / disky of = / dev / disky


然后您将使用:

PIDs=$(ps | grep dd | grep if | cut -b 1-5)

这里发生的事情是将所有需要的唯一字符通过管道传递到一个字段,并且可以使用该字段回显

回显$ PID

答案 5 :(得分:1)

这种获取正确pid的普遍方式

pid=$(cut -d' ' -f4 < /proc/self/stat)

同样好用的子

SUB(){
    pid=$(cut -d' ' -f4 < /proc/self/stat)
    echo "$$ != $pid"
}

echo "pid = $$"

(SUB)

检查输出

pid = 8099
8099 != 8100

答案 6 :(得分:0)

如果你想要一个简单的 shell 脚本来获取带有变量的最大 PID,请执行此操作

pid=$(cat /proc/sys/kernel/pid_max)
echo $pid

这将打印出最大的 PID。