1.1 进程标识
1.1.1 相关函数
pid_t getpid(void);
pid_t getppid(void);
pid_t getuid(void);
pid_t geteuid(void);
pid_t getgid(void);
pid_t getegid(void);
1.1.2 说明
上面这些函数分别用于获得当前进程的:进程 ID 、父进程 ID 、实际用户 ID 、有效用户 ID 、实际组 ID 和有效组 ID 。
1.2 创建子进程
1.2.1 相关函数
pid_t fork(void);
pid_t vfork(void);
1.2.2 说明
除了 init 等系统进程以外,创建进程的唯一方法就是调用 fork 函数。调用 fork 后,子进程完全复制父进程。对子进程, fork 返回 0 ;对父进程, fork 返回子进程的 pid 。 vfork 并不复制父进程的进程空间,在子进程调用 exec 或者 exit 之前,子进程在父进程的进程空间运行。
1.2.3 文件共享
子进程继承了父进程打开的文件描述符及其文件位移量,所以可能产生冲突,需要进行同步,也可以父进程等待子进程完成或者父、子进程执行不同的程序段以避免冲突。
1.2.4 fork 的用法
父进程希望复制自己,使父、子进程执行不同的代码段。
一个进程要调用一个不同的程序。
1.3 等待进程终止
1.3.1 相关函数
pid_t wait(int *status );
pid_t waitpid(pid_t pid , int *status ,int options );
1.3.2 说明
status 返回所等待进程的返回状态,可以用一系列的宏来检查这个状态。
调用这两个函数后,当前进程可能会:
阻塞(如果其所以子进程都还在运行)
带子进程的终止状态立刻返回(如果一个子进程以终止,正在等待父进程存取其终止状态)
出错立刻返回(如果它没有任何子进程)
1.3.3 区别
在一个子进程终止前, wait 是其调用者阻塞,而 waitpid 有一选择项可以是调用者不阻塞。
waitpid 并不等待第一个终止的子进程,它有选择项可以控制它所等待的进程。
1.4 执行程序
1.4.1 相关函数
int execve(const char *path , char *const argv [], char *const envp []);
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 []);
1.4.2 区别
以上 6 个函数中 execve 时系统调用,其他的则是库函数。
根据函数名中的字符:
p 表示该函数取文件名作为参数,并用 PATH 环境变量寻找可执行文件。没有字符 p 则表示参数为完全路径名。
l 表示该函数取一个参数表,它和字符 v 互斥。 v 表示该函数取一个参数的数组 argv[] 。
e 表示该函数取 envp[] 数组作为新程序的环境变量表,没有 e 则使用当前进程的环境变量表。
1.5 设置用户 ID 和组 ID
1.5.1 相关函数
int setuid(uid_t uid );
int setgid(uid_t gid );
int seteuid(uid_t euid );
int setegid(gid_t egid );
int setreuid(uid_t ruid , uid_teuid );
int setregid(gid_t rgid , gid_tegid );
1.5.2 规则
关于用 setuid 函数改变用户 ID 的规则(也同样适用于 setgid 函数):
若进程具有 root 特权,则 setuid 把 RUID 、 EUID 以及 SUID 都设置为 uid 。
若进程没有 root 权限,但 uid 等于 RUID 或者 SUID ,则把 EUID 设置为 uid 。
上述条件都不满足,则返回出错, errno 设为 EPERM 。
1.6 执行 shell 程序
1.6.1 相关函数
int system(const char *cmd );
1.6.2 说明
相当于执行 /bin/sh –c cmd .
对于有 suid 和 sgid 权限的程序不能使用此函数,会产生安全漏洞。
1.7 用户标识
1.7.1 相关函数
char *getlogin(void);
1.7.2 说明
得到运行该程序的用户的登录名。对于未连接到终端的进程,本函数会失败。
1.8 进程时间
1.8.1 相关函数
clock_t times(struct tms *buf);
1.8.2 说明
用于得到进程自己以及终止子进程的用户 CPU 时间和系统 CPU 时