UNIX环境编程学习笔记(17)——进程管理之进程的几个基本概念
lienhua34
2014-10-05
1 main 函数是如何被调用的?
在编译 C 程序时,C 编译器调用链接器在生成的目标可执行程序文件中,设置一个特殊的启动例程为程序的起始地址。当内核执行 C 程序时,在调用 main 前先调用这个特殊的启动例程,该启动例程从内核取得命令行参数和环境变量值。
2 共享库
共享库使得可执行文件中不再需要包含共用的库例程,而只需在所有进程都可引用的存储区中维护这种库例程的一个副本。程序第一次执行或者第一次调用某个库函数时,用动态链接方法将程序与共享库函数相链接。
共享库的另一个优点是可以用库函数的新版本代替老版本,而无需对使用该库的程序重新链接。
3 进程标识符
每个进程都有一个非负整型表示的唯一进程 ID,称为进程标识符。进程 ID 可以被重用。当一个进程终止时,其进程 ID 就可以用于另一个新的进程。不过 UNIX 通过采用延迟重用算法,使得赋予新进程的 ID 不同于最近终止的进程所使用的 ID,防止将新进程误认为是使用同一个 ID的已经终止的前进程。
UNIX 系统通常有一些特殊的进程。例如,
(1)交换进程 swapper:交换进程是 UNIX 系统的调度进程,其进程 ID 为 0.该进程是内核的一部分,它并不执行任何磁盘上的程序。init 进程 init 进程的进程 ID 为 1。它在自举过程结束时由内核调用。
(2)init进程:通常读取与系统有关的初始化文件(/etc/rc* 文件或/etc/inittab文件,以及/etc/init.d 中的文件),并将系统引导到一个状态。init 进程是一个以超级用户特权执行的用户进程,它不会终止。另外,init进程是所有孤儿进程的父进程。
UNIX 系统提供了下面两个函数用于获取进程标识符,
#include <unistd.h>
pid_t getpid(void);
返回值:调用进程的进程IDpid_t getppid(void);
返回值:调用进程的父进程ID
4 进程的实际、有效和保存的用户和组 ID
在文件访问权限与进程访问控制中,我们讲到了进程的这几个属性。
UNIX 系统提供了下面几个函数用于获取相对应的属性,
#include <unistd.h>
uid_t getuid(void);
返回值:调用进程的实际用户IDuid_t geteuid(void);
返回值:调用进程的有效用户IDgid_t getgid(void);
返回值:调用进程的实际组IDgid_t getegid(void);
返回值:调用进程的有效组ID
保存的设置用户 ID 是由 exec 函数复制有效用户 ID 而得来的。如果设置了文件的设置用户 ID 位,则 exec 函数会将文件的用户 ID 设置为进程的有效用户 ID。否则,则新进程的有效用户 ID 不会被改变。但是,无论是否设置了文件的设置用户 ID 位,exec 函数都会将进程当前的有效用户 ID 复制到保存的设置用户 ID 中。
可以调用 setuid 函数设置实际用户 ID 和有效用户 ID。与此类似,可以调用 getgid 函数设置实际组 ID 和有效组 ID。
#include <unistd.h>
int setuid(uid_t uid);
int setgid(gid_t gid);
两个函数返回值:若成功则返回0,若出错则返回-1
setuid 函数改变用户 ID 的规则为(setgid 函数改变组 ID 的规则类似),
1. 若进程具有超级用户特权,则 setuid 函数将实际用户 ID、有效用户ID,以及保存的设置用户 ID 设置为 uid。
2. 若进程没有超级用户特权,但是 uid 等于实际用户 ID 或保存的设置用户 ID,则 setuid 函数只将进程有效用户 ID 设置为 uid,不改变实际用户 ID 和保存的设置用户 ID。
3. 如果上面两个条件都不满足,则将 errno 设置为 EPERM,并返回 -1.
POSIX.1 还提供了两个函数 seteuid 和 setegid,
#include <unistd.h>
int seteuid(uid_t uid);
int setegid(gid_t gid);
两个函数返回值:若成功则返回0,若出错则返回-1
这两个函数类似 setuid 和 setgid,不过这两个函数只更改有效用户 ID 和有效组 ID。
(done)
UNIX环境编程学习笔记(17)——进程管理之进程的几个基本概念的更多相关文章
- UNIX环境编程学习笔记(21)——进程管理之获取进程终止状态的 wait 和 waitpid 函数
lienhua342014-10-12 当一个进程正常或者异常终止时,内核就向其父进程发送 SIGCHLD信号.父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用的函数(信号处理程序).对于这 ...
- UNIX环境编程学习笔记(19)——进程管理之fork 函数的深入学习
lienhua342014-10-07 在“进程控制三部曲”中,我们学习到了 fork 是三部曲的第一部,用于创建一个新进程.但是关于 fork 的更深入的一些的东西我们还没有涉及到,例如,fork ...
- UNIX环境编程学习笔记(18)——进程管理之进程控制三部曲
lienhua342014-10-05 1 进程控制三部曲概述 UNIX 系统提供了 fork.exec.exit 和 wait 等基本的进程控制原语.通过这些进程控制原语,我们即可完成对进程创建.执 ...
- UNIX环境编程学习笔记(24)——信号处理进阶学习之信号集和进程信号屏蔽字
lienhua342014-11-03 1 信号传递过程 信号源为目标进程产生了一个信号,然后由内核来决定是否要将该信号传递给目标进程.从信号产生到传递给目标进程的流程图如图 1 所示, 图 1: 信 ...
- UNIX环境编程学习笔记(23)——信号处理初步学习
lienhua342014-10-29 1 信号的概念 维基百科中关于信号的描述是这样的: 在计算机科学中,信号(英语:Signals)是 Unix.类 Unix 以及其他 POSIX 兼容的操作系统 ...
- UNIX环境编程学习笔记(9)——文件I/O之文件访问权限的屏蔽和更改
lienhua342014-09-10 1 文件访问权限 在文件访问权限和进程访问控制中,我们已经讲述过文件访问权限位,为了方便,我们重新列在下面, 表 1: 文件的 9 个访问权限位 st_mod ...
- UNIX环境编程学习笔记(3)——文件I/O之内核 I/O 数据结构
lienhua342014-08-27 内核使用三种数据结构表示打开的文件,分别是文件描述符表.文件表和 V 节点表. (1) 每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述符表,每 ...
- UNIX环境编程学习笔记(2)——文件I/O之不带缓冲的 I/O
lienhua342014-08-25 1 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数.当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符. ...
- UNIX环境编程学习笔记(20)——进程管理之exec 函数族
lienhua342014-10-07 在文档“进程控制三部曲”中,我们提到 fork 函数创建子进程之后,通常都会调用 exec 函数来执行一个新程序.调用 exec 函数之后,该进程就将执行的程序 ...
随机推荐
- jdbc连接sqlserver报错java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver
使用2008的数据库, 我已经引入的sqljdbc4的包,单还是报这个错,很奇怪突然想到在配置hibernate的时候,是拷贝下来的代码 然后到网上查了下, 因为是2008的版本驱动和2000的有点不 ...
- bootstrap table 自己设置值
在使用bootstrap table的值默认是从 total rows 里面取,可是后台返回的json数据并不是这样的怎么办 可以使用 responseHandler 自定义: $(function ...
- [转]bootstrap table本地数据使用方法
原文地址:http://www.giserdqy.com/language/h5/bootstrap/1136 data对应columns进行组合 var columns = [ { field: ' ...
- JSP_运维_JSP项目部署到server(适合0经验新手)
实战:真正server端部署jsp项目经验总结与记录(完整过程从0到10适合对server端部署0经验新手) jsp+tomcat+mysql项目部署到真正server; servermysql安装; ...
- TextBox只能输入数字
Asp.net TextBox只能输入数字 <asp:textbox id="TextBox1" onkeyup="if(isNaN(value))execComm ...
- Spark SQL讲解
Spark SQL讲解 Spark SQL是支持在Spark中使用Sql.HiveSql.Scala中的关系型查询表达式.它的核心组件是一个新增的RDD类型SchemaRDD,它把行对象用一个Sche ...
- Extjs4.x TreeGrid Dirty 更新数据,dirty标记不会自动清除的bug
如上图所示,当修改某个属性值,成功提交后,dirty的小三角不会自动清除,这个是官方treegrid的一个bug,目前尚未解决. bug:http://www.sencha.com/forum/sho ...
- CSS(九):设置盒子水平垂直居中
通过设置下面的样式可以使盒子水平垂直居中: <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- WampServer 常见问题
Wamp就是Windows 下的Apache Mysql PHP集成环境. 支持phpmyadmin 注意:安装前请先安装VC 2010运行库(vcredist2010.exe ),否则会提示没有找到 ...
- Vue 获取自定义属性的值
在jquery中,如果要获取 data-*** 的值可以通过 $('目标元素').data('属性名') 来获取. 在Vue中如何获取该值呢? 1.换个思路,作为参数传递. 如下代码: <but ...