8.2进程标识符
每个进程的唯一标识(非负整数)ID。
ID为0的进程通常为调度进程(交换进程)内核程序,不执行任何磁盘上的程序。
ID为1通常是init进程。
ID为2页守护进程。
#include <unistd.h>
//获取当前进程ID
pid_t pid = getpid();
//获取父进程
pid_t ppid = getppid();
//实际用户ID
getuid();
//有效用户ID
geteuid();
//实际组ID
getgid();
//有效组ID
getegid();
8.3 fork函数
#include <unistd.h>
pid_t pid = fork();//子进程返回0, 父进程返回子进程
文件共享(父子进程每个相同的打开描述符共享一个文件表项)。
如果希望执行一个新进程,则fork复制后立即调用exec即可。
8.4 vfork函数
和fork后调用exec功能相似,效率更高。
vfork保证子进程先运行(特定用处,也要注意死锁)!
8.5 exit 函数
三种异常终止
- 调用abort ,SIGABRT信号。
- 进程收到某些信(异常)。
- 最后一个线程对取消请求作出响应。
父进程终止后,其所有的子进程都将被init进程领养。
子进程终止但父进程未对其进行善后处理。(僵死进程,ps(1) 将僵死进程状态打印为 Z)(被init领养的进程不会成为僵死进程)。
8.6 wait和waitpid函数
调用这两个函数。
- 如果子进程还在运行则堵塞。
- 如果自进程终止(僵死状态)则立即返回,并善后僵死子进程。
- 如果没有子进程立即出错返回。
#include <sys/wait.h>
pid_t wait(int *statloc);
pit_t waitpid(pid_t pid,int* statloc,int options);
//返回状态的宏
//WIFEXITED 正常结束
//WIFSIGNALED 异常终止
//WIFSTOPED
//WIFCONTINUED
// options宏
// WCONTINUED
// WNOHANG 立即返回 返回值为0
// WUNTRACED
8.7 waitid函数
拓展版 waitpid (只有Solaris支持)
8.8 wait3和wait4
多一个参数 rusage* rusage 用来返回终止进程和其子进程使用的资源汇总。
8.9 竞争条件
进程间同步(这边不详解,后面再说)。
8.10 exec 函数
用全新的程序替代当前进程,从main函数开始执行。
8.11 更改用户ID和组ID
控制权限
#include <unistd.h>
int setuid(uid_t uid);
int setgid(git_t gid);