进程管理
进程管理 API 主要涉及进程的生命周期管理。
fork 系列
fork 系列创建子进程,复制父进程的虚拟地址空间。复制父进程的内存(代码段、数据段、栈、堆等),但通过**写时复制Copy-on-Write, COW)**优化,仅在修改时复制页面。子进程继承父进程的文件描述符、信号处理程序等。
c
pid_t fork(void);
int clone(int (*fn)(void *), void *stack, int flags, void *arg, ...);
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid = fork();
if (pid < 0) {
perror("fork");
return 1;
} else if (pid == 0) {
printf("Child process, PID: %d\n", getpid());
} else {
printf("Parent process, Child PID: %d\n", pid);
}
return 0;
}
exec 系列
exec 系列在当前进程中加载并执行新程序,替换当前进程的代码段、数据段、栈和堆。
c
int execl(const char *path, const char *arg, ... /* (char *)NULL */);
int execvp(const char *file, char *const argv[]);
wait 和 waitpid
防止子进程成为僵尸进程(已终止但未回收)。wait 阻塞直到任意子进程终止;waitpid 提供更灵活控制。
c
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
exit 和 kill
c
void exit(int status);
pid_t getpid(void);
pid_t getppid(void);
int kill(pid_t pid, int sig);
调度管理
获取或设置进程的优先级(nice 值),影响调度。调整进程的调度优先级,影响 CPU 分配。常用于优化实时任务或后台进程。
c
/**
* which:PRIO_PROCESS(进程)、PRIO_PGRP(进程组)、PR捕捉PRIO_USER`(用户)。
* who:进程 ID(0 表示当前进程)。
* prio:优先级(-20 到 19,值越低优先级越高)。
*/
int getpriority(int which, id_t who);
int setpriority(int which, id_t who, int prio);
// nice 设置新进程的优先级,renice 修改运行中进程的优先级
int nice(int inc);
int renice(int which, id_t who, int nice_value);