linux中pid gid tgid tid的区别和联系

本文详细解析了Linux系统中获取进程ID(getpid)、线程ID(gettid)及组ID(getgid)的方法,阐述了这些函数在内核层面的具体实现原理,包括tgid、pid等关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    https://blog.youkuaiyun.com/techtitan/article/details/39134927

getpid : 取得process id,对于thread,就是取得线程对应进程的id;

对应的system call:

 asmlinkage long sys_getpid(void)
1614 {
1615         return current->tgid;
1616 }

tgid = thread group id

 

/////////////////////////////////////////////////////////////////////////

 

gettid:取得线程id,如果是process,其实就等于getpid:

#define gettid() syscall(__NR_gettid)

对应的system call:

/* Thread ID - the internal kernel "pid" */
1761 asmlinkage long sys_gettid(void)
1762 {
1763         return current->pid;
1764 }

 

 

getgid:取得group id,就是user的group id

和用id命令得到的group id是一回事:

bash-3.1$ id
uid=3013(xxx) gid=300(xxxx) groups=300(xxxx),301(platform),505(fpgadrv),9022(gsm)

 

对于一个thread来说,在kenerl中可以看到他的process id(tgid),还可以看到他的thread id(pid
---------------------  
作者:techtitan  
来源:优快云  
原文:https://blog.youkuaiyun.com/techtitan/article/details/39134927?utm_source=copy  
版权声明:本文为博主原创文章,转载请附上博文链接!

<think>我们正在讨论操作系统中进程相关的ID类型。用户询问在PID(进程标识符)之下还存在哪些相关的ID,如线程ID、子进程ID等。根据操作系统知识,一个进程可能包含多个线程,每个线程有自己的ID。此外,进程之间可能存在父子关系,因此会有子进程ID(实际上子进程有自己的PID,但父进程可以通过某些方式记录子进程的PID)。常见的ID类型包括:1.PID(ProcessID):进程的唯一标识符。2.PPID(ParentProcessID):父进程的PID。3.TID(ThreadID):线程的唯一标识符。在Linux中,线程其实是用轻量级进程实现的,所以TID在底层也是一个PID(但在同一个进程内的线程,它们的PID相同,但TID不同,因为每个线程有自己唯一的线程ID)。4.PGID(ProcessGroupID):进程组ID,用于作业控制。5.SID(SessionID):会话ID,一个会话包含一个或多个进程组。6.UID(UserID)GID(GroupID):用户ID组ID,用于权限控制。7.子进程ID:实际上就是父进程创建的子进程的PID,父进程通常需要记录这些PID以便管理。注意:用户提到的“fid”可能是指文件描述符(FileDescriptor),但文件描述符并不是一个全局唯一的ID,而是进程内部用于标识打开文件的整数,不同进程可以有相同的文件描述符值指向不同的文件。因此,我们不把fid作为进程下的ID类型,而是作为进程内部资源标识。因此,我们可以总结如下:在操作系统中,一个进程(由PID标识)下可能关联的ID包括:-线程ID(TID):标识进程内的各个线程。-子进程的PID:父进程创建的子进程的进程ID(注意,子进程有自己独立的PID)。-父进程ID(PPID):标识创建该进程的父进程。-进程组ID(PGID会话ID(SID):用于进程组会话管理。此外,还有用户组相关的ID(UID、GID、EUID、EGID等)用于权限控制。下面我们按照要求进行回答:1.使用中文回答。2.行内数学表达式使用$...$格式(但这个问题中可能不需要数学表达式,所以可以省略)。3.独立公式单独成段(同样,这个问题可能不需要公式)。4.生成相关问题。5.回答结构清晰。注意:引用部分需要自然地添加引用标识。但是,我们目前引用的知识来自于操作系统的一般原理,没有特定的文献引用。然而,用户提供了几个引用,但它们当前问题关系不大。我们可以参考用户提供的引用[2]中提到的子进程回收(涉及子进程ID)作为例子,但不需要强制引用。因此,我们这样组织回答:首先,直接回答问题,列出PID下相关的ID类型。然后,简要解释每种ID的作用。最后,生成相关问题。注意:用户提供的引用[2]中涉及了子进程的回收,我们可以以此为例说明子进程ID的存在,但引用标识应自然添加。例如,在讨论子进程ID时,可以提到“在回收子进程时,父进程需要知道子进程的ID[^2]”。但是,我们也要注意引用[2]的内容实际上是关于信号处理回收子进程的代码,所以我们可以这样引用:引用[2]中的代码展示了父进程如何通过信号处理函数回收多个子进程,其中使用了`wait`函数来获取终止的子进程的PID。因此,我们可以说:“在操作系统中,父进程通常需要记录其创建的子进程的PID,以便进行管理(如回收资源)。例如,在信号处理函数中,父进程通过循环调用`wait`来回收子进程[^2]。”其他引用当前问题关系不大,可以不用。下面开始回答:</think>在操作系统中,进程标识符(PID)是进程的唯一标识,但进程管理还涉及多种相关ID类型,它们共同构成进程控制的关键结构: ### 一、PID直接关联的ID类型 1. **PPID(Parent PID)** - **作用**:标识创建当前进程的父进程。 - **特性**:每个进程(除init进程)均有父进程,可通过`getppid()`获取[^2]。 2. **TGID(Thread Group ID)** - **作用**:标识线程组(即主线程及其所有子线程)。 - **特性**:在Linux中,线程本质是轻量级进程(LWP),同一线程组的所有线程共享相同的TGID(等于主线程PID)[^2]。 3. **TID(Thread ID)** - **作用**:唯一标识进程内的单个线程。 - **特性**:通过`gettid()`获取,内核调度以TID为单位(例如`ps -eLf`可查看TID)[^2]。 4. **PGID(Process Group ID)** - **作用**:标识关联的进程组(如Shell作业控制中的前后台进程组)。 - **特性**:通过`setpgid()`设置,父进程子进程默认同属一个进程组[^2]。 5. **SID(Session ID)** - **作用**:标识终端会话(一组进程组的集合)。 - **特性**:通过`setsid()`创建新会话,会话首进程的PID即SID[^2]。 ### 二、其他关键ID - **UID/GID(User/Group ID)** 控制进程权限(真实UID、有效EUID、保存SUID)。 - **子进程PID集合** 父进程通过维护子进程PID列表管理子进程(如引用[2]中的信号回收机制)。 - **文件描述符(FD)** 进程内部资源标识(非全局ID),用于操作打开的文件/套接字等[^3]。 ### 三、ID关系示例 ```plaintext 会话 (SID=X) └─ 进程组 (PGID=Y) ├─ 父进程 (PID=P1, PPID=init, TGID=P1) │ ├─ 线程 (TID=T1) │ └─ 线程 (TID=T2) └─ 子进程 (PID=P2, PPID=P1, TGID=P2) ``` > 注:子进程PID不直接归属父进程PID,但父进程需记录子进程PID以实现管理(如引用[2]中的`wait`回收)[^2]。 ### 四、典型应用场景 - **子进程回收**:父进程通过子进程PID调用`wait()`(引用[2]的循环回收)[^2]。 - **作业控制**:Shell通过PGID管理前台/后台进程组(如`kill -PGID`终止整个组)。 - **权限检查**:内核根据EUID决定资源访问权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值