得到pid in shell(bash)

rua*_*hao 143 linux bash shell pid

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

echo $$    ## print 2433
(echo $$)  ## also print 2433
(./getpid) ## print 2602
Run Code Online (Sandbox Code Playgroud)

"getpid"是一个获取当前pid的C程序,如:

   int main() {
    printf("%d", (int)getpid());
    return 0;
   }
Run Code Online (Sandbox Code Playgroud)

令我困惑的是:

  1. 我认为"(命令)"是一个子流程(我是对的吗?),我认为它的pid应该与它的父pid不同,但它们是相同的,为什么......
  2. 当我使用我的程序在括号之间显示pid时,它显示的pid是不同的,是不是?
  3. '$$'就像宏?

你能帮助我吗?

che*_*ner 204

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

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

bash4中,您可以获取子项的进程ID BASHPID.

~ $ echo $$
17601
~ $ ( echo $$; echo $BASHPID )
17601
17634
Run Code Online (Sandbox Code Playgroud)

  • "父母"有点误导(至少对我而言),它实际上是"顶级"外壳.例如:`echo $$; (echo $$;(echo $$))`回显相同的pid三次 (13认同)
  • 所有参数扩展都以“$”开头,但“$”也是特殊参数之一的名称。`$`、`#`、`@`、`*` 等是一些特殊参数;`$$`、`$#`、`$@`、`$*` 等是扩展为每个值的表达式。 (2认同)

cra*_*ken 78

您可以使用以下之一.

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

  • 如果我们谈论的是后台进程,第二个项目符号不应该是“kill -0 $!”吗?默认情况下,“PID”未设置为任何值。 (2认同)

Nie*_*jes 25

  1. 括号在Bash中调用子shell.由于它只是一个子shell,它可能具有相同的PID - 取决于实现.
  2. 您调用的C程序是一个单独的进程,它有自己唯一的PID - 如果它在子shell中则无关紧要.
  3. $$是Bash中当前脚本PID的别名.见之间的差异$$,并$BASHPID在这里,和正上方的额外变量$BASH_SUBSHELL包含嵌套级别.


Ale*_*lex 7

尝试getppid()是否希望 C 程序打印 shell 的 PID。