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);
返回值:调用进程的进程ID

pid_t getppid(void);
返回值:调用进程的父进程ID

4 进程的实际、有效和保存的用户和组 ID

文件访问权限与进程访问控制中,我们讲到了进程的这几个属性。

UNIX 系统提供了下面几个函数用于获取相对应的属性,

#include <unistd.h>
uid_t getuid(void);
返回值:调用进程的实际用户ID

uid_t geteuid(void);
返回值:调用进程的有效用户ID

gid_t getgid(void);
返回值:调用进程的实际组ID

gid_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)——进程管理之进程的几个基本概念的更多相关文章

  1. UNIX环境编程学习笔记(21)——进程管理之获取进程终止状态的 wait 和 waitpid 函数

    lienhua342014-10-12 当一个进程正常或者异常终止时,内核就向其父进程发送 SIGCHLD信号.父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用的函数(信号处理程序).对于这 ...

  2. UNIX环境编程学习笔记(19)——进程管理之fork 函数的深入学习

    lienhua342014-10-07 在“进程控制三部曲”中,我们学习到了 fork 是三部曲的第一部,用于创建一个新进程.但是关于 fork 的更深入的一些的东西我们还没有涉及到,例如,fork ...

  3. UNIX环境编程学习笔记(18)——进程管理之进程控制三部曲

    lienhua342014-10-05 1 进程控制三部曲概述 UNIX 系统提供了 fork.exec.exit 和 wait 等基本的进程控制原语.通过这些进程控制原语,我们即可完成对进程创建.执 ...

  4. UNIX环境编程学习笔记(24)——信号处理进阶学习之信号集和进程信号屏蔽字

    lienhua342014-11-03 1 信号传递过程 信号源为目标进程产生了一个信号,然后由内核来决定是否要将该信号传递给目标进程.从信号产生到传递给目标进程的流程图如图 1 所示, 图 1: 信 ...

  5. UNIX环境编程学习笔记(23)——信号处理初步学习

    lienhua342014-10-29 1 信号的概念 维基百科中关于信号的描述是这样的: 在计算机科学中,信号(英语:Signals)是 Unix.类 Unix 以及其他 POSIX 兼容的操作系统 ...

  6. UNIX环境编程学习笔记(9)——文件I/O之文件访问权限的屏蔽和更改

    lienhua342014-09-10 1 文件访问权限 在文件访问权限和进程访问控制中,我们已经讲述过文件访问权限位,为了方便,我们重新列在下面, 表 1: 文件的 9 个访问权限位  st_mod ...

  7. UNIX环境编程学习笔记(3)——文件I/O之内核 I/O 数据结构

    lienhua342014-08-27 内核使用三种数据结构表示打开的文件,分别是文件描述符表.文件表和 V 节点表. (1) 每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述符表,每 ...

  8. UNIX环境编程学习笔记(2)——文件I/O之不带缓冲的 I/O

    lienhua342014-08-25 1 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数.当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符. ...

  9. UNIX环境编程学习笔记(20)——进程管理之exec 函数族

    lienhua342014-10-07 在文档“进程控制三部曲”中,我们提到 fork 函数创建子进程之后,通常都会调用 exec 函数来执行一个新程序.调用 exec 函数之后,该进程就将执行的程序 ...

随机推荐

  1. Mybatis之工作原理

    1.Mybatis的架构 1.1 Mybatis的框架分层 1.2 MyBatis的实现原理 mybatis底层还是采用原生jdbc来对数据库进行操作的,它支持定制化 SQL.存储过程以及高级映射的优 ...

  2. Spring Batch中job的启动,停止,放弃操作

    1,启动一个job 运行一个批处理任务至少有两点要求:一个 JobLauncher 和一个用来运行的 job .它们都包含了相同或是不同的 context .举例来说,从命令行来启动job,会为每一个 ...

  3. C#学习笔记(5)——大项目查找

    说明(2017-5-27 16:34:39): 1. 注意事项: (0)设计窗体,添加一个dgv,添加5个列名,修改名字和绑定数据. (1)添加引用,system.data.sqlclient (2) ...

  4. 实验吧 web题writeup

    1.http://ctf5.shiyanbar.com/web/wonderkun/web/index.html 用户名我输入:or'xor"and"select"uni ...

  5. 解决Eclipse异常关闭后重启报 org.eclipse.swt.SWTException: Invalid thread access 的问题

    . . . . . 很久没有写博客了,最近实在是太忙,一直想写点干货,但是一直没静下心来学习. 今天又在加班忙碌之中,结果谁知道越忙碌越出问题.先是 weblogic 没有正常启动,凭经验第一反应就是 ...

  6. Unity3D-RPG项目实战(4):角色性能測试

    前言 用一个新的引擎.还是要沉下心来学习.记得2007年用Unreal Engine 3做项目的时候.就有过慘痛的教训:前面话了个把月的时间学习Unreal.认为摸门了.于是就着急忙慌的进入项目正式开 ...

  7. JD 题目1040:Prime Number (筛法求素数)

    OJ题目:click here~~ 题目分析:输出第k个素数 贴这么简单的题目,目的不清纯 用筛法求素数的基本思想是:把从1開始的.某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉.剩下 ...

  8. JavaScript 里面的整数 位 操作

    JavaScript 整数位操作. 与 操作符 & val num1 = 10; val num2 = 11; val num3 = num1 & num2; // num3 == 1 ...

  9. Android——黑名单管理(二)

    说明:多加一点完善 1.在操作类 DAO 将连接数据库也放到了构造方法中(错误),加删除全部的方法 2.主界面增加了姓名一栏,用layout文件将对话框分离出来 3.删除加确认提示 4.加删除全部按钮 ...

  10. sublime sftp注册码

    注册码: { "email": "xiaosong@xiaosong.me", "product_key": "d419f6-de ...