- 浏览: 1658360 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (405)
- C/C++ (16)
- Linux (60)
- Algorithm (41)
- ACM (8)
- Ruby (39)
- Ruby on Rails (6)
- FP (2)
- Java SE (39)
- Java EE (6)
- Spring (11)
- Hibernate (1)
- Struts (1)
- Ajax (5)
- php (2)
- Data/Web Mining (20)
- Search Engine (19)
- NLP (2)
- Machine Learning (23)
- R (0)
- Database (10)
- Data Structure (6)
- Design Pattern (16)
- Hadoop (2)
- Browser (0)
- Firefox plugin/XPCOM (8)
- Eclise development (5)
- Architecture (1)
- Server (1)
- Cache (6)
- Code Generation (3)
- Open Source Tool (5)
- Develope Tools (5)
- 读书笔记 (7)
- 备忘 (4)
- 情感 (4)
- Others (20)
- python (0)
最新评论
-
532870393:
请问下,这本书是基于Hadoop1还是Hadoop2?
Hadoop in Action简单笔记(一) -
dongbiying:
不懂呀。。
十大常用数据结构 -
bing_it:
...
使用Spring MVC HandlerExceptionResolver处理异常 -
一别梦心:
按照上面的执行,文件确实是更新了,但是还是找不到kernel, ...
virtualbox 4.08安装虚机Ubuntu11.04增强功能失败解决方法 -
dsjt:
楼主spring 什么版本,我的3.1 ,xml中配置 < ...
使用Spring MVC HandlerExceptionResolver处理异常
进程管理2
1、用户和组:
进程是和用户和组关联的,用户id和组id分别是C语言的uid_t和gid_t类型表示。数字表示和可读字符串之间的映射关系
是通过用户空间的/etc/passwd和/etc/group两个文件完成的,内核只处理数字表示形式。
在Unix系统中,一个进程的用户ID和组ID代表这个进程可以执行哪些文件操作以及向其他进程发送信号的能力。进程必须以
合适的用户和组运行,最好的方式是遵循“最小权限”的原则。这个要求是变化的:如果进程在前期需要以root用户的权限
运行,那么后面不需要root权限了,那么就应该在后面尽可能采用权限更小的用户权限运行。
1)一个进程的 real user ID 是指运行此进程的用户角色的 ID。
2)一个进程的 effective user ID 是指此进程目前实际有效的用户 ID(也就是权限的大小),effective user ID 主要用来
校验权限时使用,比如打开文件、创建文件、修改文件、向别的进程发信号,等等。
如果一个进程是以 root 身份来运行的,那么上面这两个 ID 可以用 setuid/seteuid 随便修改,但是如果一个进程是以普通
用户身份来运行的,那么上面这两个 ID 一般来说是相同的,并且也不能随便修改。只有一种情况例外:
此进程的可执行文件的权限标记中,设置了“设置用户 ID”位!
3)设置用户id是文件权限的一个标记,可以通过
chmod +s /path/to/file
来设置用户id位。一旦用了这个命令之后,再执行这个文件,那么生成的进程的 effective user ID 就变成了这个可执行文件
的 owner user ID(属主用户 ID)。
4)保存的设置用户id,是程序在执行exec一个setuid程序(设置了设置用户id标记位的文件)之前的有效用户id,这样可以保存
通过保存的设置用户id来恢复之前的有效用户的id
当一个用户登录的时候,login程序会把真实的用户ID和有效的用户ID设置成/etc/passwd文件中指定的UID,当一个进程fork的
时候,子进程会从父进程那继承它。真实UID和真实GID标识进程的真实所有者,会影响到发送信号的权限。
2、改变实际用户(组)ID 和保存设置的用户(组)ID
setuid是用来设置当前进程的有效id。如果当前用户的有效id是root,那么实际用户id和保存设置的用户id也会被同时设置为uid,
root用户可以为uid提供任何值,从而将所有三种用户id都设置成uid了。非root用户只允许将实际用户id和保存设置的用户id最为
uid的实际参数传递,也就是有效用户id只能是这两种的一个值。
成功返回0,错误返回-1,并设置errno:
EAGAIN: uid的值和实际用户id的值不同,把uid设置为real user id会让用户超过他的NRPOC限制(它指定了一个用户可以拥有的
进程数)。
EPERM:用户不是root,uid既不是有效也不是保存用户ID。
上面的讨论也适合setgid。
3、改变有效用户或者组id:
Linux提供了两个POSIX所定义的函数来改变当前进程的有效用户id和组id的值:
seteuid是将有效用户ID的值设置为euid。root用户可以为euid提供任何值,而非root用户只能将有效用户ID设置设置为实际用户
ID或者保存设施的用户ID。成功返回0,失败返回-1,并且把errno设置为EPERM,它代表当前进程的所有者不是root用户,并且euid
既不等于用户ID也不同于实际用户id也不等于保存用户id。
非root用户,seteuid和setuid的行为一样。始终使用seteuid()是一个标准实践和好的方法,除非你的进程倾向于以root身份运行,
这样setuid会变得更有意义。
4、获得用户和组ID:
以下两个系统调用返回真实用户和组的ID:
相应的以下两个系统调用返回有效用户和组的ID:
这两组系统调用不会失败。
5、会话和进程组:
每个进程都属于某个进程组,进程组是由一个或者多个相互间有关联的进程组成,它的目的是为了作业控制。
进程组的主要特征是信号可以给进程组中的所有的进程:这个信号使同一个进程组中的所有进程终止、停止
或者继续运行。
每一个进程组都由进程组ID(pgid)唯一来标识,并且有一个组长进程(process goup leader),进程组的ID
就是组长进程的pid。只要在某个进程组中还有一个进程存在,则该进程组就存在,即使组长进程终止了,该进程
仍然存在。
当新的用户登录计算机时,登录进程就会为这个用户创建一个新的会话。这个会话中只有用户登录shell这一个进程。
登录shell作为会话首进程(session leader)。会话囊括了登录用户的所有活动,并且分配给用户一个控制终端。
1)与会话相关的系统调用:
在登录时,shell会创建新的会话。这是通过以下系统调用完成的:
setsid创建的新会话,并在其中创建一个新的进程组,而且调用进程称为新会话的首进程和进程组的组长进程。
成功返回,新会话的会话ID,错误时,返回-1,并把errno设置成EPERM,表示调用进程是当前进程组的组长进程。
有一个简单的方法可以使得任何进程都不成为组长进程:创建一个新进程,终止父进程,让子进程来调用setsid。
例如:
获得当前进程的会话id,虽然不怎么常用:
调用成功返回进程会话ID。如果参数是0,则返回调用进程的会话id。
错误返回-1,并设置errno为ESRCH,表示pid不代表任何进程。
其他的UNIX系统可能设置errno为EPERM,它表示pid指示的进程和调用进程不属于同一个会话。Linux
倾向于返回任何进程的会话id。
2)与进程组相关的系统调用:
setpgid将进程pid的进程的进程组ID设置为pgid:
如果pid是0,则使用调用者的进程id。如果pgid是0,则将pid进程的id设置为进程组的ID。
成功返回0。
a)pid代表的进程必须是调用者或者是其子进程,而且子进程没有调用过exec函数,并且pid进程和
调用者在同一个会话中。
b)pid进程不能使会话首进程。
c)如果pgid已经存在,那么必须与调用者在同一个会话中。
d)pgid非负。
错误返回-1,并且把errno设置成:
EACCESS pid进程是迪欧用进程的子进程,并且子进程调用了exec函数。
EINVAL pgid < 0
EPERM pid进程是会话的首进程,或者与调用者不在同一个会话中的另一个进程。也可能试图把进程放置
到一个不同在一个会话的进程组中。
ESRCH pid不是当前进程或者当前进程的子进程。
可以通过会话获得进程的进程组ID:
成功返回pid进程组的ID。如果pid是0,返回当前进程的进程组ID,出错返回-1,而errno的唯一值是ERSCH,
表示pid是一个非法的进程标识符。
获得当前进程的进程组ID:
参考:
1、《Linux system programming》
2、《Unix system programming》
3、《Advanced Programming in the Unix Environment》
1、用户和组:
进程是和用户和组关联的,用户id和组id分别是C语言的uid_t和gid_t类型表示。数字表示和可读字符串之间的映射关系
是通过用户空间的/etc/passwd和/etc/group两个文件完成的,内核只处理数字表示形式。
在Unix系统中,一个进程的用户ID和组ID代表这个进程可以执行哪些文件操作以及向其他进程发送信号的能力。进程必须以
合适的用户和组运行,最好的方式是遵循“最小权限”的原则。这个要求是变化的:如果进程在前期需要以root用户的权限
运行,那么后面不需要root权限了,那么就应该在后面尽可能采用权限更小的用户权限运行。
1)一个进程的 real user ID 是指运行此进程的用户角色的 ID。
2)一个进程的 effective user ID 是指此进程目前实际有效的用户 ID(也就是权限的大小),effective user ID 主要用来
校验权限时使用,比如打开文件、创建文件、修改文件、向别的进程发信号,等等。
如果一个进程是以 root 身份来运行的,那么上面这两个 ID 可以用 setuid/seteuid 随便修改,但是如果一个进程是以普通
用户身份来运行的,那么上面这两个 ID 一般来说是相同的,并且也不能随便修改。只有一种情况例外:
此进程的可执行文件的权限标记中,设置了“设置用户 ID”位!
3)设置用户id是文件权限的一个标记,可以通过
chmod +s /path/to/file
来设置用户id位。一旦用了这个命令之后,再执行这个文件,那么生成的进程的 effective user ID 就变成了这个可执行文件
的 owner user ID(属主用户 ID)。
4)保存的设置用户id,是程序在执行exec一个setuid程序(设置了设置用户id标记位的文件)之前的有效用户id,这样可以保存
通过保存的设置用户id来恢复之前的有效用户的id
当一个用户登录的时候,login程序会把真实的用户ID和有效的用户ID设置成/etc/passwd文件中指定的UID,当一个进程fork的
时候,子进程会从父进程那继承它。真实UID和真实GID标识进程的真实所有者,会影响到发送信号的权限。
2、改变实际用户(组)ID 和保存设置的用户(组)ID
#include <sys/types.h> #include <unistd.h> int setuid(uid_t uid); int setgid(gid_t gid);
setuid是用来设置当前进程的有效id。如果当前用户的有效id是root,那么实际用户id和保存设置的用户id也会被同时设置为uid,
root用户可以为uid提供任何值,从而将所有三种用户id都设置成uid了。非root用户只允许将实际用户id和保存设置的用户id最为
uid的实际参数传递,也就是有效用户id只能是这两种的一个值。
成功返回0,错误返回-1,并设置errno:
EAGAIN: uid的值和实际用户id的值不同,把uid设置为real user id会让用户超过他的NRPOC限制(它指定了一个用户可以拥有的
进程数)。
EPERM:用户不是root,uid既不是有效也不是保存用户ID。
上面的讨论也适合setgid。
3、改变有效用户或者组id:
Linux提供了两个POSIX所定义的函数来改变当前进程的有效用户id和组id的值:
#include <sys/types.h> #include <unistd.h> int seteuid(uid_t euid); int setegid(gid_t egid);
seteuid是将有效用户ID的值设置为euid。root用户可以为euid提供任何值,而非root用户只能将有效用户ID设置设置为实际用户
ID或者保存设施的用户ID。成功返回0,失败返回-1,并且把errno设置为EPERM,它代表当前进程的所有者不是root用户,并且euid
既不等于用户ID也不同于实际用户id也不等于保存用户id。
非root用户,seteuid和setuid的行为一样。始终使用seteuid()是一个标准实践和好的方法,除非你的进程倾向于以root身份运行,
这样setuid会变得更有意义。
4、获得用户和组ID:
以下两个系统调用返回真实用户和组的ID:
#include <unistd.h> #include <sys/type.h> uid_t getuid(void); gid_t getgid(void);
相应的以下两个系统调用返回有效用户和组的ID:
#include <unistd.h> #include <sys/type.h> uid_t geteuid(void); gid_t getegid(void);
这两组系统调用不会失败。
5、会话和进程组:
每个进程都属于某个进程组,进程组是由一个或者多个相互间有关联的进程组成,它的目的是为了作业控制。
进程组的主要特征是信号可以给进程组中的所有的进程:这个信号使同一个进程组中的所有进程终止、停止
或者继续运行。
每一个进程组都由进程组ID(pgid)唯一来标识,并且有一个组长进程(process goup leader),进程组的ID
就是组长进程的pid。只要在某个进程组中还有一个进程存在,则该进程组就存在,即使组长进程终止了,该进程
仍然存在。
当新的用户登录计算机时,登录进程就会为这个用户创建一个新的会话。这个会话中只有用户登录shell这一个进程。
登录shell作为会话首进程(session leader)。会话囊括了登录用户的所有活动,并且分配给用户一个控制终端。
1)与会话相关的系统调用:
在登录时,shell会创建新的会话。这是通过以下系统调用完成的:
#include <unistd.h> pid_t setsid(void);
setsid创建的新会话,并在其中创建一个新的进程组,而且调用进程称为新会话的首进程和进程组的组长进程。
成功返回,新会话的会话ID,错误时,返回-1,并把errno设置成EPERM,表示调用进程是当前进程组的组长进程。
有一个简单的方法可以使得任何进程都不成为组长进程:创建一个新进程,终止父进程,让子进程来调用setsid。
例如:
pid_t pid; pid = fork(); if(pid == -1){ perror("fork"); return -1; }else if(pid != 0){ exit(EXIT_SUCESS); } if(setsid() == -1){ perror("setsid"); return -1; }
获得当前进程的会话id,虽然不怎么常用:
#include <unistd.h> pid_t getsid(pid_t pid);
调用成功返回进程会话ID。如果参数是0,则返回调用进程的会话id。
错误返回-1,并设置errno为ESRCH,表示pid不代表任何进程。
其他的UNIX系统可能设置errno为EPERM,它表示pid指示的进程和调用进程不属于同一个会话。Linux
倾向于返回任何进程的会话id。
pid_t sid; sid = getsid(0); if(sid == -1) perror("getsid"); else printf("My session id=%d\n",sid);
2)与进程组相关的系统调用:
setpgid将进程pid的进程的进程组ID设置为pgid:
#include <unistd.h> int setpgid(pid_t pid, pid_t pgid);
如果pid是0,则使用调用者的进程id。如果pgid是0,则将pid进程的id设置为进程组的ID。
成功返回0。
a)pid代表的进程必须是调用者或者是其子进程,而且子进程没有调用过exec函数,并且pid进程和
调用者在同一个会话中。
b)pid进程不能使会话首进程。
c)如果pgid已经存在,那么必须与调用者在同一个会话中。
d)pgid非负。
错误返回-1,并且把errno设置成:
EACCESS pid进程是迪欧用进程的子进程,并且子进程调用了exec函数。
EINVAL pgid < 0
EPERM pid进程是会话的首进程,或者与调用者不在同一个会话中的另一个进程。也可能试图把进程放置
到一个不同在一个会话的进程组中。
ESRCH pid不是当前进程或者当前进程的子进程。
可以通过会话获得进程的进程组ID:
#include <unistd.h> pid_t getpgid(pid_t pid);
成功返回pid进程组的ID。如果pid是0,返回当前进程的进程组ID,出错返回-1,而errno的唯一值是ERSCH,
表示pid是一个非法的进程标识符。
获得当前进程的进程组ID:
pid_t pgid; pgid = getpgid(0); if(pgid == -1) perror("getpgid"); else printf("My process group id=%d\n",pgid);
参考:
1、《Linux system programming》
2、《Unix system programming》
3、《Advanced Programming in the Unix Environment》
发表评论
-
【zz】Vim的分屏
2012-04-26 11:13 1603分屏启动Vim 使用大写 ... -
bash的几种for循环
2012-04-26 11:13 18581、罗列式 for VARIABLE in 1 2 3 ... -
【zz】几个简单选项让你的Readline(Bash)更好用
2011-10-10 23:08 2429Reddit上的一位仁兄贴出了他的readline手册学习成果 ... -
pipe in -exec
2011-09-27 22:35 1433一个简单的例子: 将一堆的.txt文件,合并成一个文件,让每个 ... -
[zz]Unix调试的瑞士军刀:lsof
2011-08-31 10:33 1507原文见:http://heikezhi.com/2011/06 ... -
[zz]关于xargs,你可能不知道的
2011-08-29 23:05 2483如果你曾经花了许多时间在Unix命令行上,那么或许你已经见过x ... -
使用scala.sys.process包和系统交互
2011-07-19 00:00 6501在Java中我们可以使用Runtime.getRuntime( ... -
virtualbox 4.08安装虚机Ubuntu11.04增强功能失败解决方法
2011-06-23 22:17 14482在笔记本安装Ubuntu11.04增强功能失败 引用 fuli ... -
awk getline
2011-06-02 23:58 5848awk getline开始一直用做按行读取文件。 getlin ... -
[zz]服务器性能评估
2011-04-29 14:17 4032工作这么久了,主 ... -
[zz]Top命令VIRT,RES,SHR,DATA的含义
2011-04-10 15:50 4133VIRT:virtual memory usage ... -
[zz]一些shell命令
2011-04-10 15:35 15191.显示消耗内存/CPU最多的10个进程 ps aux | ... -
Open VPN免密码配置
2011-03-03 22:55 3589公司VPN的帐号密码使用的是个超长的随机数,每次输入很麻烦,如 ... -
Linux下使用RTX腾讯通
2011-03-03 22:46 10795在公司为了使用RTX,专门安装了一个XP的虚拟机,但是这个也不 ... -
[zz]linux 常用命令总结:
2010-12-11 21:30 1700linux 常用命令总结: 一。 通用命令: 1. dat ... -
Ubuntu10.10解决Empathy无法链接MSN的问题
2010-10-21 16:36 37581.在Empathy中删除无法登录的MSN账户,并关闭Empa ... -
[zz]Vim的分屏功能
2010-10-21 13:09 1708分屏启动Vim 使用大写 ... -
Ubuntu10.10 64bit使用Eclipse插件subclipse问题
2010-10-20 20:32 1974升级到ubuntu10.10什么坑都碰到了,郁闷啊。发现sub ... -
scim输入法,Eclipse代码提示之后失去焦点的问题
2010-10-20 13:36 3095突然发现Eclipse,每次代码提示之后无法打字,感觉是文本域 ... -
Linux下使用谷歌输入法
2010-10-18 23:01 3149Linux的中文输入法一直太烂,scim终于出来对google ...
相关推荐
### Linux系统编程学习笔记 #### 一、IO **1.1 标准I/O (stdio)** - **fopen/fclose**: `fopen` 用于打开或创建一个文件,并返回一个指向该文件的 `FILE *` 类型的指针。`fclose` 用于关闭一个已经打开的文件。...
Linux系统编程是一门专注于Linux操作系统上应用程序和工具开发的学科。它包含了广泛的领域,如文件操作、进程管理、内存管理以及网络编程等。开发者在这一领域中,从基础的文件系统交互到复杂的网络通信和多线程编程...
Linux系统编程笔记涉及到的内容广泛,涵盖了从基础的出错处理到进程管理,从内存管理到进程间通信,以及守护进程设计等多个层面的知识。下面详细说明各个部分的知识点: 1. 常见出错处理 - abort函数用于异常终止...
【Linux 系统编程与内核驱动开发笔记】 在深入探讨Linux系统编程和内核驱动开发之前,我们首先要理解Linux操作系统的基本概念。Linux是一种自由、开放源码的类Unix操作系统,广泛应用于服务器、桌面环境以及各种...
根据提供的文件信息,我们可以推断出这是一份关于Linux编程学习笔记的PDF资料。下面将对这份资料可能涉及的关键知识点进行详细的阐述。 ### Linux编程基础知识 #### 1. Linux操作系统概述 - **定义与特点**:Linux...
总的来说,"Linux系统编程及网络编程笔记"会详细解析上述各个方面,包括理论知识、实际示例和最佳实践,旨在帮助学习者深入理解Linux环境下的系统编程和网络编程,为开发高效、安全的系统级应用程序和网络服务打下...
Linux操作系统是全球众多程序员...总之,Linux操作系统的学习笔记覆盖了从系统安装到文件管理,从用户权限到进程调度,从设备管理到网络控制等多个层面的知识点,是学习Linux操作系统和提升系统管理能力的重要资源。
通过阅读《LinuxUNIX系统编程手册》(英文版),配合个人整理笔记和config.ini配置文件的辅助,读者将能够全面掌握Linux和UNIX环境下的系统编程技巧,从而能够编写高效、稳定的系统级应用程序。无论是对操作系统原理...
### Linux系统编程笔记知识点概述 #### 一、常见出错处理 在Linux系统编程中,正确处理各种可能发生的错误对于程序的稳定性和可靠性至关重要。以下是一些常用的错误处理方法: ##### 1. `abort` - **定义**:`#...
进程是程序的运行实例,管理系统资源和执行程序代码。Unix/Linux提供了丰富的进程管理工具和系统调用,如`fork`用于创建新进程,`exec`系列用于执行新程序,`wait`和`signal`用于进程间通信。 ### Unix/Linux系统的...
学习Linux的进程管理对于理解和操作系统的运行至关重要。本篇笔记主要探讨了以下几个方面的知识点: 1. **进程状态**: - **可运行态(TASK_RUNNING)**:进程正在CPU上执行或等待执行。 - **可中断的等待(TASK_...
IX 只能够用于单一的 Unix 系统进程间通信,而 AF_INET 是针对Internet的,因而可以允许在 远程 主机之间通信(当我们 man socket 时发现 domain 可选项是 PF_*而不是AF_*,因为 glibc 是 posix 的实现 所以用 PF代替...
《马哥的Linux学习笔记》是一份针对初学者和进阶者精心编撰的Linux教程,旨在帮助读者全面掌握Linux操作系统的核心概念、命令行操作以及系统管理技能。这份笔记以清晰明了的语言和实例解析了Linux系统的各个方面,是...
Linux学习笔记——入门资料 Linux,作为一款开源、免费的操作系统,因其稳定性和安全性而备受开发者和系统管理员的青睐。这份“Linux学习笔记”旨在帮助初学者快速掌握Linux的基础知识和操作技能,从而轻松入门。 ...
进程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
Linux学习基础笔记主要涵盖Linux操作系统的基本概念、安装与配置、常用命令、文件系统管理、用户权限与用户组、进程管理、网络配置以及shell脚本编程等多个方面。以下是对这些知识点的详细阐述: 1. **Linux操作...
总的来说,这份“Linux课堂学习笔记”资料包提供了一个全面的学习路径,涵盖了从基础的Linux操作系统原理,到ARM架构的硬件特性,再到实际的设备驱动编程。对于想要在Linux环境下进行嵌入式开发的学员来说,是一份...
进程间通信简介-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
Linux学习笔记PDF文档.pdf是一个详尽的资源,旨在帮助初学者和有经验的用户深入理解Linux操作系统。Linux作为开源的类Unix系统,以其稳定、安全和可定制性在全球范围内广泛应用于服务器、桌面环境以及嵌入式设备。这...