linux线程有自己的pid么

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux线程有自己的pid么相关的知识,希望对你有一定的参考价值。

参考技术A 线程是现代操作系统上进行并行执行的一个流行的编程方面的抽象概念。当一个程序内有多个线程被叉分出用以执行多个流时,这些线程就会在它们之间共享 特定的资源(如,内存地址空间、打开的文件),以使叉分开销最小化,并避免大量高成本的IPC(进程间通信)通道。这些功能让线程在并发执行时成为一个高 效的机制。
在Linux中,程序中创建的线程(也称为轻量级进程,LWP)会具有和程序的PID相同的“线程组ID”。然后,各个线程会获得其自身的线程 ID(TID)。对于Linux内核调度器而言,线程不过是恰好共享特定资源的标准的进程而已。经典的命令行工具,如ps或top,都可以用来显示线程级 别的信息,只是默认情况下它们显示进程级别的信息。
这里提供了在Linux上显示某个进程的线程的几种方式。

方法一:PS
在ps命令中,“-T”选项可以开启线程查看。下面的命令列出了由进程号为<pid>的进程创建的所有线程。
1.$ ps -T -p <pid>

“SID”栏表示线程ID,而“CMD”栏则显示了线程名称。

方法二: Top
top命令可以实时显示各个线程情况。要在top输出中开启线程查看,请调用top命令的“-H”选项,该选项会列出所有Linux线程。在top运行时,你也可以通过按“H”键将线程查看模式切换为开或关。
1.$ top -H

要让top输出某个特定进程<pid>并检查该进程内运行的线程状况:
$ top -H -p <pid>

方法三: Htop
一个对用户更加友好的方式是,通过htop查看单个进程的线程,它是一个基于ncurses的交互进程查看器。该程序允许你在树状视图中监控单个独立线程。
要在htop中启用线程查看,请开启htop,然后按<F2>来进入htop的设置菜单。选择“设置”栏下面的“显示选项”,然后开启“树状视图”和“显示自定义线程名”选项。按<F10>退出设置。

现在,你就会看到下面这样单个进程的线程视图。本回答被提问者采纳

Linux/Unix Bash 脚本如何知道自己的 PID?

【中文标题】Linux/Unix Bash 脚本如何知道自己的 PID?【英文标题】:How does a Linux/Unix Bash script know its own PID? 【发布时间】:2011-01-30 10:06:22 【问题描述】:

我在 Bash 中有一个名为 Script.sh 的脚本,它需要知道自己的 PID(即我需要在 Script.sh 中获取 PID)

知道怎么做吗?

【问题讨论】:

【参考方案1】:

使用$BASHPID$$

请参阅 [手册][1] 了解更多信息,包括两者之间的差异。

TL;DRTFM

$$ 扩展为 shell 的进程 ID。 在() 子shell 中,它扩展为调用shell 的进程ID,而不是子shell。 $BASHPID 扩展为当前 Bash 进程的进程 ID(bash 4 的新功能)。 在() 子shell 中,它扩展为子shell 的进程ID [1]:http://www.gnu.org/software/bash/manual/bashref.html#Bash-Variables

【讨论】:

【参考方案2】:

变量$$ 包含PID。

【讨论】:

【参考方案3】:

您可以使用$$ 变量。

【讨论】:

【参考方案4】:

PID 存储在$$

示例:kill -9 $$ 将终止调用它的 shell 实例。

【讨论】:

kill -9(带有-9标志)被认为是有害的,只有在绝对必要时才使用)。 它被认为是“危险的”,因为进程没有机会响应信号(并且可能会自行清理)。做kill -9 $$ 只做一件事。它会杀死 当前的 shell 进程。如果您在 shell 会话中做了一些不想写入 .bash_history 的操作,这很有用,例如:docker run -e PASSWORD=hunter2 ircbot【参考方案5】:

除了 Jefromi 引用的Advanced Bash Scripting Guide 中给出的示例之外,这些示例还展示了管道如何创建子外壳:

$ echo $$ $BASHPID | cat -
11656 31528
$ echo $$ $BASHPID
11656 11656
$ echo $$ | while read line; do echo $line $$ $BASHPID; done
11656 11656 31497
$ while read line; do echo $line $$ $BASHPID; done <<< $$
11656 11656 11656

【讨论】:

你能解释一下“ 它将字符串重定向到循环中(或任何读取 stdin 的内容)。该字符串被称为“此处字符串”。【参考方案6】:

如果进程是子进程且没有设置$BASHPID,则可以查询正在运行的进程创建的子进程的ppid。它可能有点难看,但它有效。示例:

sleep 1 &
mypid=$(ps -o ppid= -p "$!")

【讨论】:

【参考方案7】:

无论您身在何处(在交互式命令行或脚本中),如果您无权访问 $BASHPID,您都可以通过以下方式访问您当前的 shell pid:

bash -c 'echo $PPID'

其中简单的引号对于防止过早的字符串解释是必不可少的(以确保解释发生在子进程中,而不是当前进程中)。 原理就是创建一个子进程并询问其父pid,即“我自己”。 此代码比基于 ps 的 Joakim 解决方案更简单。

【讨论】:

以上是关于linux线程有自己的pid么的主要内容,如果未能解决你的问题,请参考以下文章

Linux 下线程的理解

Linux 上的线程标识

如何获取linux内核线程的pid

Linux学习5-线程

linux 最多支持多少个线程

Linux下的进程与线程—— 信号