² 进程通常由程序、数据和进程控制块3个部分组成。程序部分描述了进程所要完成的功能;数据部分为进程提供了搜需的堆栈和私有数据;进程控制块含有进程的描述和控制信息。
² 进程和线程:一个进程可以拥有多个线程。线程没有独立的资源,它共享进程的ID,共享进程的资源。线程是UNIX中最小的调度单位。
² 前台进程和后台进程:用户在Shell提示符下键入命令,创建进程,此后该进程接管终端,Shell中不能再输入其他的命令,知道进程执行完毕,才将终端控制权返回Shell并显示用户提示符。这样的进程就是前台进程。‚如果用户再输入Shell命令时,在命令串后加上“&”,shell将不等待进程执行完毕就直接返回,于是就可以同事运行进程和执行shell操作,这样的进程就是后台进程,后台进程并不接管终端,所以必须是非交互式的。
² 守护进程:与终端无关,常驻后台执行的特殊进程。UNIX中最著名的两个守护进程:sysproc进程,它是UNIX的第一个进程,标识号为0,能合理地调度系统中运行的进程,负责将进程从硬盘交换区调入内如或者讲进程从内存调到硬盘交换区‚init进程,系统初始化进程,标识号1,是除sysproc外所有进程的祖先。
² 进程状态:运行态:进程已经分配到CPU,正在处理机上执行时的状态。同意时刻处于运行态的进程数不能大于CPU的数目。运行态可分为用户态和核心态。如果进程正在运行用户代码,进程处于用户态。如果进程出现系统调用或者系统中断,运行操作系统内部代码,进程处于核心态。‚就绪态:进程已具备运行条件,但其他进程正在用CPU,所以暂时不能运行而等待分配CPU的状态。处于就绪态的进程一旦获得了CPU就能立刻运行。ƒ睡眠态:进程正在等待某种事件的发生而暂时不能运行的状态。处于睡眠态的进程尚不具备运行条件,即使CPU空闲,它也无法使用。
² 进程标识号:UNIX中每个进程具有唯一的标识号,操作系统采用一个非负整数标识每一个进程。
UNIX中读取进程ID号的函数如下:
#include <sys/types.h>
#include<unistd.h>
pid_t getpid(); //返回当前进程ID
pid_t getpgrp(); //返回当前进程组ID
pid_t getppid(); //返回父进程ID
类型pid_t是进程标识类型,可以用long或者int代替
² 进程的用户标识号:当进程由用户启动时,该用户的标识号就是进程的实际用户标识,该用户的组标识号就是进程实际组标识号。进程的实际用户标识号和实际组标识号仅用于系统记账,参与权限检查的是进程的有效用户标识号和有效组标识号。一般情况下,实际标识号和有效标识号相一致。
UNIX中读取用户ID号函数如下:
#include<unistd.h>
uid_t getuid(); //返回进程实际用户ID
uid_t geteuid(); //返回进程有效用户ID
gid_t getgid(); //返回进程实际组ID
gid_t getegid(); //返回进程有效组ID
实例:
#include <sys/types.h>
#include <unistd.h>
void main()
{
printf("pid=%d,gid=%d,ppid=%d\n",getpid(),getpgrp(),getppid());
printf("uid=%d,euid=%d,gid=%d,egid=%d\n",getuid(),geteuid(),getgid(),getegid());
}
² 进程命令行
实例:
#include <stdio.h>
void main(int argc,char * argv[])
{
int i;
fprintf(stderr,"argc=%d\n",argc);
for(i=0;i<argc;i++)
fprintf(stderr,"argv[%d]=%s\n",i,argv[i]);
}
² 环境变量
UNIX中,存储了一系列的变量,在shell下执行"env"命令查看。
环境变量分为系统环境变量和用户环境变量。系统环境变量在注册师自动设置。用户环境变量在shell中使用赋值命令和export命令设置。如下例设置了变量ZYX,再将其转化为用户环境变量:
#ZYX=/u/zyx //赋值语句
#export ZYX //export语句
#env |grep zyx //验证变量
ZYX=/u/zyx
² 获取环境变量的方法:
全局变量法。
UNIX用一个指针数组来存储全部环境值:
extern char **environ;
实例:
#include <stdio.h>
extern char **environ;
int main()
{
char **p=environ;
while(*p)
{
fprintf(stderr,"%s\n",*p);
p++;
}
}
‚函数调用法。
UNIX中操作环境变量的函数如下:
#include <stdlib.h>
char *getenv(char *name);
int putenv(const char *string);
函数getenv以字符串形式返回环境变量name的取值,如果参数name为NULL或者环境变量列表无name变量,返回NULL。
函数putenv增加、修改或删除环境变量。参数string指向一个字符串,格式为“name=value”。如果环境列表中没有name变量,则增加变量并设置值为"value";如果变量已经存在,则更改其值为"value";如果value为空,在删除环境变量name的值。函数成功时返回非0值,否则返回0。
实例:
#include <stdlib.h>
#include <stdio.h>
int main(int argc,char **argv)
{
int i;
for(i=1;i<argc;i++)
fprintf(stderr,"%s=%s\n",argv[i],getenv(argv[i]));
}