1.类型
进程一般分为交互进程、批处理进程和守护进程三类。值得一提的是守护进程总是活跃的,一般是后台运行,守护进程一般是由系统在开机时通过脚本自动激活启动或超级管理用户root来启动。比如在
Fedora或Redhat中,我们可以定义httpd
服务器的启动脚本的运行级别,此文件位于/etc/init.d目录下,文件名是httpd,/etc/init.d/httpd
就是httpd服务器的守护程序,当把它的运行级别设置为3和5时,当系统启动时,它会跟着启动。
2.状态
linux上进程有5种状态: ps工具标识进程的5种状态码:
1>运行(正在运行或在运行队列中等待) R 运行 runnable (on run queue)
2>中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) S 中断 sleeping
3>不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)D 不可中断 uninterruptible sleep (usually IO)
4>僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放) Z 僵死 a defunct ("zombie") process
5>停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行) T 停止 traced or stopped
3.进程控制
1>fork创建进程
2>通过exec函数组实现对其他程序的引用
3>调用exit,终止进程,释放资源,变成僵尸进程
4>调用wait,并销毁僵尸进程
4.进程调度
通过根据进程优先级的高低,决定分配给进程时间片的多少,优先级由nice决定(-20[最高优先级]<=nice<=19[最低优先级])
调整进程运行优先级可以用renice命令,只有root才可以降低nice值,其他用户只能增加nicezhi
5.有关进程的系统调用
1>进程创建:fork()和vfork()
fork采用写时拷贝(copy-on-write,COW)的方法,具体就是延缓资源复制,只有当子进程对内存数据存在写入操作时,才会进行资源复制,相反,则不会复制.
vfork创建子进程后,父进程会被暂时阻塞,然后子进程使用父进程的资源(此处应防止子进程改变父进程的数据,除非需要),直到要么子进程退出,要么子进程调用exec,父进程继续.
2>进程执行:exec函数组
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);
此处只有execve是真正意义上的系统调用,其它都是在此基础上经过包装的库函数。
exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。与一般情况不同,exec函数族的函数执行成功后不会返回,因为调用进程的实体,包括代码段,数据段和堆栈等都已经被新的内容取代,只留下进程ID等一些表面上的信息仍保持原样,此处linux的"写时拷贝(copy-on-write)"技术得到具体应用,如果fork完之后我们马上就调用exec,则不复制父进程的内容,也就提高了效率。
此处六个函数给人感觉很富杂,但是其有一定的规律:3个execl开始的函数,其参数是罗列出来的,3个execv开始的是以
数组的方式传递的(此处注意:无论是罗列参数,还是数组传递参数,其最后一个参数必须为NULL),2个以e结尾的函数都含有envp[],此处环境变量
是自定义的,其余四个使用系统默认的环境变量,两个以p结尾的函数可以只传递程序名,而不必是路径,其余必须是路径.
3>wait(),waitpid()
等待子进程退出,收集僵尸进程,并将其销毁
4>sleep()
进程挂起等待
5>system
将字符串传递给命令解释器,并执行
6>进程消亡:exit(),_exit()
_exit()函数的作用最为简单:直接使进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;exit()函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序(如检查文件的打开情况,把文件缓冲区中的内容写回文件等)
6.进程相关id及操作
UID:真正用户标志号
EUID:有效用户标志号
GID:真正用户组标志号
EGID:有效用户组标志号
PID:进程标志号
PGID:进程组标志号
getpgid(pid):得到pid的进程组标志号,getpgid(0)得道当前进程组标志号
getpgrd():相当于getpgid(0)
getpid():得到当前进程pid
getppid():得到父进程pid
getuid():得到进程用户标志号
geteuid():获得进程有效用户标志号
setuid():为当前进程设置真正和有效用户id
setgid():为当前进程设置真正有效用户组id
setpgrd():将当前进程组id设置成与该进程pid相等.
setpgid():将进程号为参数pid的进程的进程组id设定为参数pgid
nice():改变进程优先权
阅读(1283) | 评论(0) | 转发(0) |