-
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 件事:
- 该进程变成新会话的 session leader,此时,该进程是新会话中的唯一进程。
- 该进程成为新进程组的组长。也即新进程组 id 等于该进程 id.
- 该进程没有控制终端(控制终端的概念后面会说)。如果在调用 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) 来获得。