进程的各种ID

9 篇文章 0 订阅
6 篇文章 0 订阅
  • pid(进程ID)

UNIX进程总是会分配一个号码用于在其命名空间中唯一的标识他们。该号码被称为进程ID号,简称PID。用fork或者clone产生的每个进程都由内核自动的分配一个新的唯一的PID值。

#include <sys/types.h>
#include <unistd.h>
pid_t getpid( void );
  • ppid(父进程ID)

程序的父进程ID号

#include <sys/types.h>
#include <unistd.h>

pid_t getppid ( void )
  • PGID(进程组ID)

在 linux 中,进程不但有自己的 id 号,还会有一个组 id 号。我们把拥有相同组 id 号的进程的集合称为一个进程组。每个进程都会有进程组 ID,表示该进程所属的进程组。默认情况下新创建的进程会继承父进程的进程组 ID。

  • 进程组组长

进程组组长是进程组中的某一个进程,该进程的进程号等于进程组的进程号。

// 获取进程 pid 的进程组 id.
pid_t getpgid(pid_t pid);

// 指定 pid 为进程组组长或将 pid 加入到组 pgid.
int setpgid(pid_t pid, pid_t pgid);

找到进程 ID 为 pid 的进程,将其进程组 ID 修改为 pgid,如果 pid 的值为 0,则表示要修改调用进程的进程组 ID。

  •  SID(会话 ID)

进程组是一个或多个进程的集合。而会话(session),是一个或多个进程组的集合。创建进程组的进程,是进程组组长,而创建会话的进程,是会话长,通常我们不说会话长,而是称其为会话首进程,用英文其实更加确切——session leader。每个进程也都有会话 ID。默认情况下,新创建的进程会继承父进程的会话 ID。

//创建一个新会话。需要注意的是,调用此函数的进程不能是进程组组长,否则会失败
pid_t setsid(void)

如果调用者调用该函数,调用者进程就会创建新的会话,这将发生下面 3 件事:

  1. 该进程变成新会话的 session leader,此时,该进程是新会话中的唯一进程。
  2. 该进程成为新进程组的组长。也即新进程组 id 等于该进程 id.
  3. 该进程没有控制终端(控制终端的概念后面会说)。如果在调用 setsid 之前该进程有一个控制终端,那么这种联系也被切断
     
/*获取进程 pid 的会话 id。但是,如果进程 pid 和调用进程不在同一个会话,调用此函数失败。通常 pid 的值传 0,表示获取调用进程所在的会话 id.*/
pid_t getsid(pid_t pid)
  • 线程ID 

POSIX线程也有线程id,类型pthread_t,可以由 pthread_self()获取,线程id由线程库维护。各个进程独立,所以会有不同进程中线程号相同节的情况。那么这样就会存在一个问题,我的进程p1中的线程pt1要与进程p2中的线程pt2通信怎么办,进程id不可以,线程id又可能重复,所以这里会有一个真实的线程id唯一标识,tid。glibc没有实现gettid的函数,所以我们可以通过linux下的系统调用 syscall(SYS_gettid) 来获得。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值