三 进程的特殊操作
1.获得进程ID
进程的ID种类如下:
- PID:进程编号
- UID:创建进程的用户信息
- EUID:创建进程的用户对进程所属可执行文件的操作权限信息
- GID:创建进程的用户所属组信息
- EGID:标识进程目前所属用户组
- PGID:标识进程组信息
获得进程的GID:
gid_t getgid(void);
gid_t getgid(void);
获得进程的PID:
pid_t getpid(void);
pid_t getppid(void);//获得父进程PID
获得进程的PGID:
pid_t getpgrp(void);
pid_t getpgid(pid_t pid);//获得指定进程的PGID
2.setuid和setgid系统调用
int setuid(uid_t uid);//设置进程UID
int setgid(gid_t gid);//设置进程GID
setuid()
函数可修改发出调用进程的UID,参数uid为创建进程的用户信息。如果以普通用户的UID作为参数执行该调用,Linux内核将直接设置进程UID为参数uid信息。如果以根用户的UID作为参数,为保障系统的安全性,Linux内核将以进程表和u区中用户真实的标识号来设置进程UID。
setuid()
函数执行成功时,返回值为0,否则返回-1。
3.setpgrp和setpgid系统调用
用于设置进程的PGID,一般形式为:
int setpgrp(void);
int setpgid(pid_t pid,pid_t pgid);
setpgrp()
函数直接将进程的PGID设为与PID相同的数值。
setpgid()
以其中参数修改PGID。参数pid为指定进程的PID,值为0时修改发出调用进程的PGID;参数pgid为指定的PGID信息,值为0时,修改所有PID与参数pid相等的进程,将这些进程的PGID值设为参数pgid值。若以普通用户权限发出此调用,而PGID原本为根用户组所有,那只有在指定进程与调用进程的EUID相同时,或者指定进程为调用进程的子进程时才有效。
4.chdir系统调用
将进程的当前工作目录改为由参数指定的目录。该调用的一般形式如下:
int chdir(const char* path);
参数path为指定目录的路径,发出该调用的进程必须具备该目录的执行权限。调用成功时返回0,否则返回-1,并设置相应的错误代码。
5.chroot系统调用
又被称为根交换操作,作用通常是在一个Linux系统上虚拟另一个Linux系统,根交换后,所有的命令操作都被重新定向。一般形式如下:
int chroot(const char* path);
参数path为新的根目录路径,执行后,进程将以该目录作为根目录,并且使进程不能访问该目录以外的内容。
该操作不改变当前工作目录,如果当前工作目录在指定目录以外,则无法访问其中的内容。
根交换操作只能由根用户发出,调用成功时返回值为0,错误时返回-1,并设置相应的错误代码。
6.nice系统调用
用来改变进程的优先级。一般形式如下:
int nice(int inc);
参数inc为调用nice()函数的进程优先级数值的增量。优先级数值越低的值,被调度上CPU运行的机会越大;优先级数值越高,被调度上CPU运行的机会越低。但是,只有根用户能为inc参数设置负值,使进程优先级提高,普通用户设置的正值会降低优先级。 当调用成功时,返回值为0,否则为-1。