CSAPP - 8. 异常控制流
8.4 进程控制¶
8.4.1 获取进程ID¶
pid_t是存储PID的类型,在Linux中是int
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void); // 返回调用者pid
pid_t getppid(void); // 返回调用者父亲pid
8.4.2 创建和终止进程¶
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
void exit(int status); // 以status退出程序,不返回
pid_t fork(void); // 子进程返回0,父进程返回子进程PID,如果出错,返回-1
对于运行在单处理器上的程序,fork进程图中所有顶点的任一拓扑排序都是一个可行的运行结果
8.4.3 回收子进程¶
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
// 参数pid 如果>0,等待单独子进程,如果为-1,等待所有子进程
// 返回: 如果成功,则为子进程的PID,如果WNOHANG,则为0,如果其他错误,则为-1
// 错误: 没有子进程,返回-1,errno为ECHILD,被信号中断,返回-1,errno为EINTR
// WEXITSTATUS(statusp): 子进程exit的status
pid_t waitpid(pid_t pid, int *statusp, int options);
pid_t wait(int *statusp); // waitpid的简单版本,如果成功返回PID,如果失败返回-1
// wait(&status) 等价于 waitpid(-1, &status, 0);
8.4.4 让进程休眠¶
#include <unistd.h>
unsigned int sleep(unsigned int secs); // 返回还要休眠的描述
int pause(void); // 暂停到接收到信号为止,总是返回-1
8.4.5 加载并运行程序¶
#include <unistd.h>
int execve(const char *filename, const char *argv[], const char *envp[]);
// 如果成功,不返回,否则-1
Linux操作环境数组的函数
#include <stdlib.h>
char *genenv(const char *name); // 返回: 若存在,返回指向name的指针,若不存在,返回NULL
// overwrite非零表示如果有oldvalue则覆盖,为0表示不覆盖
int setenv(const char *name, const char *newvalue, int overwrite); // 若成功返回0,失败返回-1
void unsetenv(const char *name); // 删除name