Unix环境高级编程-进程控制(1)
在设计应用时,总是试图使用最小特权(least privilege)模型,依据此模型,程序应当只具有为完成给定任务所需的最小权限,可用setuid函数设置实际用户ID和有效用户ID。用setgid函数设置实际组ID和有效组ID。下表总结了更改3个用户ID的不同方法
解释器文件:
起始行形式是:#! pathname
最常见的解释器文件以下列行开始:#! /bin/sh
对这种文件的识别是由内核作为exec系统调用处理的一部分来完成的,内核实际使用的不是解释器文件,而是文件中第一行pathname指向的文件。
解释器的作用:
1.有些程序是用某种语言写的脚本,解释器文件可将这一事实隐藏。
2.解释器脚本使我们可以使用除了/bin/sh以外其他shell来编写shell脚本。
函数system:
该函数在实现中,调用了fork,exec和waitpid。因此有三种返回值
1.fork失败或waitpid返回除了EINTR之外的出错,则system返回-1
2.如果exec失败(表示不能执行shell),则其返回值如同shell执行了exit(127)一样。
3. 否则所有函数都成功(fork,exec和waitpid),system返回值是shell的终止状态。
进程会计:
unix提供一个选项进行进程会计处理,启动后,每当进程结束后内核就会写一个会计记录,典型的会计记录包含命令名,所使用cpu时间总量,用户ID和组ID,启动时间等。
一个至今没有说明的函数acct启动和禁用启动会计,唯一使用这个函数的是accton命令,会计记录写到指定的文件中去,会计记录样式基本如下:
会计记录所需的各个数据由内核保存在进程表中,并在一个新进程被创建时初始化,进程终止时写一个会计记录。这会带来一些问题:
1.不能获取永远不终止的进程的会计记录,像init进程,不会产生会计记录
2.在会计文件记录的顺序对应于进程终止的顺序,而非它们启动的顺序。会计记录对应于进程而不是程序,在fork之后,内核为子进程初始一个记录,而不是在一个新程序被执行时初始化,虽然exec并不创建一个新的会计记录,但相应记录中的命令名改变了,这意味着,如果一个进程顺序执行了3个程序,只会写最后一个程序,但cpu时间是三个程序之和。
进程调度:
unix对于进程提供的只是给予调度优先级的粗粒度的控制,调度策略和调度优先级是由内核确定的,进程可通过调整nice值选择以更低优先级运行(通过调整nice值降低它对cpu的占有),进程可以通过nice函数获取或更改它的nice值
posted on 2016-07-30 22:10 sichenzhao 阅读(99) 评论(0) 编辑 收藏 举报