每个进程除了有一个进程ID之外,还属于一个进程组,每个进程组有唯一一个进程组ID。
函数getpgrp返回调用进程的进程组ID。
#include <unistd.h>
pid_t getpgrp(void);
//返回值:调用进程的进程组ID
函数应用:
#include <unistd.h>
#include <stdio.h>
int main()
{
printf("my gid=%d\n",getpgrp());
return 0;
}
运行结果:my gid=7173
getpgid()用来取得参数pid 指定进程所属的组识别码. 如果参数pid 为0, 则会取得目前进程的组识别码
#include <unistd.h>
pid_t getpgid(pid_t pid);
组长进程
- 每个进程组可以有个组长进程,组长进程的ID就是进程组的ID
- 组长进程可以创建进程组以及该组中的进程
- 进程组的创建从第一个进程(组长进程)加入开始
- 进程组的组号取第一个加入组的进程(组长进程)编号
只要在某个进程组中有一个进程存在,则该进程组就存在,这与其组长进程是否终止无关。
从进程组创建开始到其中最后一个进程离开为止的时间区间称为进程组的生命周期。
setpgid()将参数pid 指定进程所属的组识别码设为参数pgid 指定的组识别码. 如果参数pid 为0,则会用来设置目前进程的组识别码, 如果参数pgid 为0, 则会以目前进程的进程识别码来取代.
#include <unistd.h>
int setpgid(pid_t pid, pid_t pgid);
//执行成功则返回组识别码, 如果有错误则返回-1, 错误原因存于errno 中
进程调用setsid函数创建一个会话:
#include <unistd.h>
pid_t setsid(void);
//成功返回进程组ID,失败返回-1
- 该进程变成新会话的会话首进程,此时,该进程是新会话中的唯一进程。
- 该进程成为一个新进程组的组长进程。新进程组ID是该调用进程的进程ID。
- 该进程没有控制终端。如果在调用setsid之前有一个控制终端,那么这种联系也会被切断。
getsid函数返回会话首进程的进程组ID。
#include <unistd.h>
pid_t getsid(pid_t pid);
如果pid是0,getsid返回调用进程会话首进程的进程组ID。