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 函数之后,该进程就将执行的程序 ...
随机推荐
- vue-router "path" is required in a route configuration
启用了动态路由,一直提示这个错误,页面打开也是空白,后来发现原来是component参数错误. 正确的写法为: component: () => import ('@/views/own-spa ...
- hashCode()方法与equals()方法的说明
1,一般我们自己用时,只使用equals()方法,用于判断两个对象是否是业务上等价的.2,在重写equals()方法时,强烈推荐也要重写hashCode()方法,因为有的集合用到了hashCode() ...
- 【转】Oracle 自定义函数语法与实例
原文地址:https://blog.csdn.net/libertine1993/article/details/47264211 Oracle自定义函数的语法如下: create or replac ...
- 在VMware中为CentOS配置静态ip并可访问网络
在VMware中为CentOS配置静态ip并可访问网络-windows下的VMware 首先确保虚拟网卡(VMware Network Adapter VMnet8)是开启的,然后在windows的 ...
- openh264 api 使用
IS_PARAMETER_SET_NAL:是不是参数集nal 头文件codec_api.h codec_app_def.h codec_def.h codec_ver.h SEncParamExt.i ...
- Navi.Soft31.WebMVC框架(含示例地址)
1概述 1.1应用场景 互联网高速发展,互联网软件也随之越来越多,Web程序越来越被广泛使用.它部署简单,维护方便,深得众多软件公司使用 Bootstrap前端框架,是最近非常流行的框架之一.它简洁, ...
- postgresql远程连接中断的处理
在网络上连接远程服务器postgresql时,不活动时间稍长就会自动断开连接,不利于操作. 琢磨了一下,服务器上使用以下网络配置时,解决了这个问题. #man 7 tcp net.ipv4.t ...
- Visual Studio的Debugger Visualizers
在英文网站上找到一份清单,列出了Visual Studio的Debugger Visualizers,觉得很好,记下来备注并分享: ASP, WEB:ASP.NET control graph vis ...
- linux下udev简介
一.关于Udev u即user space,dev是device,通过它的名字,我们就可以简单了解到,它是一个和用户态相关的驱动设备管理机制.udev是一个针对2.6内核的文件系统.提供一种基于用户空 ...
- IDEA MAVEN Failed to create a Maven project 'C:/gitProjects/mayProj/pom.xml' already exists in VFS
When adding the module to an existing module that already has a POM, it is necessary to manually spe ...