进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端
摘要:本文主要介绍进程的基本属性,基本属性包含:进程ID、父进程ID、进程组ID、会话和控制终端.
进程基本属性
1.进程ID(PID)
函数定义:
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);
函数说明:
每一个进程都有一个非负整型表示的唯一进程ID(PID).好比方我们的身份证一样,每一个人的身份证号是唯一的.由于进程ID标示符总是唯一的,常将其用来做其它标示符的一部分以保证其唯一性。进程ID(PID)是无法在用户层改动的.
在Linux系统中,PID为0 的进程一般是调度进程。经常被称为交换进程,也是第一个系统进程.第一个用户进程是init进程。其PID为1.
在应用编程中。调用getpid()函数能够获得当前进程的PID,此函数没有參数,假设运行成功返回当前进程的PID。失败返回-1。出错原因存储于errno.
样例1:打印自己的进程ID(PID).
#include <unistd.h>
#include <stdio.h>
int main()
{
pid_t pid; //pid_t 事实上是int
pid = getpid();
printf("the current program's pid is %d\n",pid);
while(1);
return 0;
}
执行后使用“ps u”命令查看对比一下.
2.父进程ID(PPID)
函数定义:
#include <sys/types.h>
#include <unistd.h>
pid_t getppid(void);
函数说明:
不论什么进程(除init进程)都是由还有一个进程创建。该进程称为被创建进程的父进程。被创建的进程称为子进程。父进程ID无法在用户层改动.父进程的进程ID即为子进程的父进程ID(PPID).
用户能够通过调用getppid()函数来获得当前进程的父进程ID(PPID).此函数没有參数,假设运行成功返回当前进程的父进程ID(PPID)。失败返回-1,出错原因存储于errno.
样例1:打印自己的父进程PPID.
#include <unistd.h>
#include <stdio.h>
int main()
{
pid_t ppid; //pid_t 事实上是int
ppid = getppid();
printf("the current program's ppid is %d\n",ppid);
while(1);
return 0;
}
执行后使用“ps u”命令查看对比一下.
3.进程组ID(process group ID PGID)
函数定义:
#include <unistd.h>
int setpgid(pid_t pid, pid_t pgid);
pid_t getpgid(pid_t pid);
pid_t getpgrp(void); /* POSIX.1 version */
pid_t getpgrp(pid_t pid); /* BSD version */
int setpgrp(void); /* System V version */
int setpgrp(pid_t pid, pid_t pgid); /* BSD version */
函数说明:
在Linux系统中。每一个用户都实用户ID(UID)和用户组ID(GUID).相同,进程也拥有自己的进程ID(PID)和进程组ID(PGID). 进程组是一个或多个进程的集合;他们与同一作业相关联.每一个进程组都有唯一的进程组ID(PGID),进程组ID(PGID)能够在用户层改动.比方。将某个进程加入到还有一个进程组,就是使用setpgid()函数改动其进程组ID.
用户能够通过调用getpgid()函数来获得当前进程的进程组ID(PGID).若此參数为0表示获取当前进程的进程组ID,假设运行成功返回当前进程的进程组ID(PGID)。失败返回-1。出错原因存储于errno. 建议使用POSIX.1规定中的无參数getprgp()函数替代getpgid(pid)函数.
进程组ID(PGID)也能够通过函数getpgrp()获得.通过fork()函数产生的子进程会继承它的父进程的进程组ID(PGID).
每一个进程组都能够有一个组长进程,组长进程的进程组ID等于其进程ID.但组长进程能够先退出。即仅仅要在某个进程组中有一个进程存在,则该进程组就存在,与其组长进程是否存在无关.进程组的最后进程能够退出或转移到其它组.
能够将某个进程增加到某个进程组中,调用系统函数setpgid().其第一个參数为欲改动进程组ID(PGID)的进程ID(PID),第二參数为新的进程组ID(PGID),假设这两个參数相等,则由pid指定的进程变为该进程组组长。假设pid为0,则使用调用者的进程ID(即改动当前进程的进程组ID(PGID为指定的pgid));假设pgid是0,则由pid指定的进程ID(PID)。用做进程组ID(PGID)(即:pid所指进程作为进程组的组长进程).
一个进程仅仅能为自己或子进程设置进程组ID(PGID),假设在它的子进程中调用了exec()等系列函数,就不再能改变该子进程的进程组ID(PGID).
#include <unistd.h>
#include <stdio.h>
int main()
{
int i;
printf("\t pid \tppid \t pgid\n");
printf("parent:\t%d\t%d\t%d\n",getpid(),getppid(),getpgid(0));
for(i=0; i<2; i++)
{
if(fork()==0)
{
printf("child:\t%d\t%d\t%d\n",getpid(),getppid(),getpgid(0));
}
}
sleep(500);
return 0; }
输出:
4.会话(session)
函数定义:
#include <unistd.h>
pid_t getsid(pid_t pid);
pid_t setsid(void);
函数说明:
会话是一个或多个进程组的集合.系统调用函数getsid()用来获取某个进程的会话ID(SID).
假设pid是0。返回调用进程的会话SID,一般说来。改制等于进程组ID(PGID).假设pid并不属于调用者所在的会话。则调用者就无法获取SID.
某个进程的会话ID也是能够改动的。调用函数setsid()用来创建一个新的会话.
假设调用进程已经是一个进程组的组长,则此函数返回错误.假设不是,则返回一个新的会话.
(1)该进程变成新会话首进程。会话首进程是创建该会话的进程。此时,该进程是新会话唯一的进程.
(2)该进程成为一个新的进程组的组长进程.新的进程组ID(PGID)是该调用进程的PID.
(3)该进程没有控制终端.假设在调用setsid()之前该进程就有一个控制终端,那么这样的联系也会中断.
图1 进程组合会话的进程安排
5.控制终端(controlling terminal)
函数定义:
#include <unistd.h>
pid_t tcgetpgrp(int fd);
int tcsetpgrp(int fd, pid_t pgrp);
函数说明:
会话和进程组的关系:
(1)一个会话能够有一个控制终端,建立于控制终端相连接的会话首进程被称为控制进程.
(2)一个会话中的几个进程组可被分为一个前台进程组和几个后台进程组,假设一个会话有一个控制终端,则他有一个前台进程组.
(3)不管何时键入终端的中断键,都会将中断信ID发送给前台进程组的全部会话。不管何时键入终端的退出键,都会将退出信ID发送给前台进程组的全部会话.
假设终端监測到调制解调器(或网络)已经断开连接,则将挂断信ID发送给控制进程(会话首进程).
调用函数tcgetgrpt()获取与打开的终端相关联的前台进程组的进程组ID.
调用函数tcsetgrpt()设置某个进程组是前台进程还是后台进程组.
假设进程有一个控制终端,则将前台进程组ID设置为pgrp,pgrp的值应该在同一会话中的一个进程组的ID。fd为控制终端的文件描写叙述符.
假设调用tcsetpgrp()函数的是会话中的后台进程组的进程,则该进程不会堵塞,或者忽略SIGTTOU信号.信号SIGTTOU将会发送给该进程组的全部进程.
当fd是指向进程的控制终端,函数tcgetpgrp()返回终端的前台进程组的进程组ID,该ID值是一个大于1且没有使用的值.假设fd指向的不是进程的终端,则函数返回-1,并设置errno指示出错.
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDAwNjEwMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" height="327" width="544">
图2 显示控制终端的进程组和会话
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------勿在浮沙筑高台。静下心来,慢慢地沉淀---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端的更多相关文章
- 进程 、进程组、会话、控制终端之间的关系 (转载 http://blog.csdn.net/yh1548503342/article/details/41891047)
一个进程组可以包含多个进程 进程组中的这些进程之间不是孤立的,他们彼此之间或者存在者父子.兄弟关系,或者在功能有相近的联系. 那linux为什么要有进程组呢?其实提供进程组就是方便管理这些进程.假设要 ...
- 进程组与会话 Linux Process Groups and Sessions
在类Unix系统中,用户通常会跟各种相关的进程打交道.虽然在登录的时候只有一个终端进程(用户对应的登录shell ,通过这个shell启动各种程序和服务),但通常不久以后就会产生许多相关的进程,例如进 ...
- Linux-进程、进程组、作业、会话、控制终端详解
一.进程 传统上,Unix操作系统下运行的应用程序. 服务器以及其他程序都被称为进程,而Linux也继承了来自unix进程的概念.必须要理解下,程序是指的存储在存储设备上(如磁盘)包含了可执行机器指 ...
- 如何按名称或PID查找一个进程?如何按端口号查找一个进程?如何查看一个进程的CPU和内存、文件句柄使用情况?如何查看CPU利用率高的TOP10进程清单?如何根据PID强制终止进程?
如何按名称或PID查找一个进程?如何按端口号查找一个进程?如何查看一个进程的CPU和内存.文件句柄使用情况?如何查看CPU利用率高的TOP10进程清单? 目录 如何按名称或PID查找一个进程?如何按端 ...
- 【转】linux 设置用户id 设置组id
linux 设置用户id 设置组id 转自 linux 设置用户id 设置组id 最近看apue,简单记录对设置用户id理解(设置组id同理). 1. 相关的id好像很多,共有哪些? 文件2个 ...
- 设置用户ID和设置组ID
与一个进程关联的ID有6个或更多,如下图所示: 与每个进程相关联的用户ID和组ID 实际用户ID 实际组ID 我们实际是谁 有效用户ID 有效组ID 附加组ID 用于文件访问权限检索 保存的设置用户I ...
- 系统数据文件和信息之附加组ID
4.2BSD引入了附加组ID(supplementary group ID)的概念.我们不仅可以属于口令文件记录项中组ID所对应的组,也可属于多达16个另外的组.文件访问权限检查相应被修改为:不仅将进 ...
- 用户id,组id和文件访问权限
实际用户ID和实际组ID:标示了我们究竟是谁,这两个字段在登录时取自口令文件中的登录项 有效用户ID和有效组ID以及附属组ID:决定了我们的文件的访问权限(通常有效用户ID等于实际用户ID,有效组ID ...
- linux保存的设置用户/组ID(set-user-ID)的测试
直接贴代码和结果 // FileName: id.cpp #include <iostream> #include <unistd.h> using namespace std ...
随机推荐
- 使用overtrue/socialite实现第三方登陆
composer下载包 将申请的配置内容放在.ENV文件中 在services.php文件中引用 控制器 其他第三方登陆同理,拿到client_id,client_secret 和redirect_u ...
- [BZOJ1017][JSOI2008]魔兽地图DotR 树形dp
1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 2597 Solved: 1010[Submit][ ...
- AC日记——Dining poj 3281
[POJ-3281] 思路: 把牛拆点: s向食物连边,流量1: 饮料向t连边,流量1: 食物向牛1连边,流量1: 牛2向饮料连边,流量1: 最大流: 来,上代码: #include <cstd ...
- jQuery实现日期字符串格式化
1. js仿后台的字符串的StringFormat方法 function StringFormat() { if (arguments.length == 0) return null; var st ...
- Hadoop打包成jar包在集群上运行时出现的各种问题以及解决方案
之前将eclipse下编好的mapreduce代码放到集群上面跑,发现速度很慢,namenode节点的cpu和内存使用率很低,datanode节点基本上处于没有运行的状态,然后通过查看hadoop-e ...
- What makes grep consider a file to be binary?
grep -a worked for me: $ grep --help [...] -a, --text equivalent to --binary-files=text
- [POI2014]Supercomputer
题目大意: 给定一个$n(n\le10^6)$个结点的有根树,从根结点开始染色.每次可以染和已染色结点相邻的任意$k$个结点.$q(q\le10^6)$组询问,每次给定$k$,问至少需要染几次? 思路 ...
- kubernetes1.5.2集群部署过程--安全模式
使用https安全模式部署kubernetes集群,能保证集群通讯安全.有效限制非授权用户访问.但部署比非安全模式复杂的多. 本文为etcd.kubernetes集群中各个组件配置证书认证,所有组件通 ...
- [置顶]
kubernetes资源对象--ResourceQuotas
概念 Resource Quotas(资源配额,简称quota)是对namespace进行资源配额,限制资源使用的一种策略. K8S是一个多用户架构,当多用户或者团队共享一个K8S系统时,SA使用qu ...
- oc的插件
umbra https://umbra3d.com/ 很不错