跳转至

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