ps axuw
a 显示所有用户拥有控制终端的进程信息
x 包括没有控制终端的进程
u 详细显示
w 更大列宽显示
R 运行中
S 可唤醒睡眠,系统中断,获得资源,收到信号,都能·1唤醒
D 不可唤醒睡眠,只能被wake_up系统调用唤醒
T 收到SIGSTOP(19)信号进入暂停状态,收到SIGCONT(18)信号后继续运行
Z 僵尸,已终止但未被回收
< 高级优先
N 低级优先
L 存在被锁定的内存分页
s 会话首进程
l 多线程进程
+ 前台进程组中#include <unistd.h> //函数
#include <sys/types.h> //重命名类型
pid_t getpid(void); // 返回当前进程ID
pid_t getppid(void); // 返回父进程ID
uid_t getuid(void); // 返回用户ID
gid_t getgid(void); // 返回当前用户组ID
uid_t geteuid(void); // 返回有效用户ID
gid_t getegid(void); // 返回有效用户组ID创建子进程(子进程拷贝代码区数据和文件描述符表)
#include <unistd.h> //函数
#include <sys/types.h> //重命名类型
pid_t fork(void);
功能:创建子进程
返回值:成功父子进程分别返回子进程PID和0,失败返回-1创建新进程
exec函数族
#include <unistd.h>
int execl (const char* path, const char* arg, ...);
l: list
path 路径
arg 可执行文件
... 不定长参数
int execlp(const char* file, const char* arg, ...);
lp: path 若第一个参数中不包含 '/',则将其视为文件名,并根据 PATH 环境变量搜索该文件
int execle(const char* path, const char* arg, ..., char* const envp[]);
le: environment 新进程的环境变量以字符串指针数组 (char* const envp[]) 的形式传入,数组以空指针结束;不指定环境变量则从调用进程复制
int execv (const char* path, char* const argv[]);
v: vector 新进程的命令行参数以字符串指针数组 (char* const argv[]) 的形式传入,数组以空指针结束
int execvp(const char* file, char* const argv[]);
int execve(const char* path, char* const argv[], char* const envp[]);
#include <stdlib.h>
int system (const char* command);
功能: 执行shell命令
参数: command shell命令行字符串
返回值: 成功返回command进程终止状态,失败-1
参数取NULL时返回非0表示shell可用,0表示不可用
内部调用vfork,exec,waitpid等。调用fork或waitpid错误返回-1,exec错误执行exit(127),都成功返回command(由waitpid的status参数获得)fork: 几乎全部“复制”一份 (地址空间写时复制, FD/环境等共享或复制元数据).
exec: 只保留“内核级”属性(身份/FD/环境/目录/资源限制/信号屏蔽字等), 丢弃并重建“用户态地址空间” (代码+数据+栈+自定义信号处理).
终止(正常或异常终止都会向父进程发送17号信号,且终止后进程还存在,进程回收后消失)
正常终止
#include <stdlib.h>
void exit(int status);
功能:令进程终止
参数:status 进程退出码,相当于main函数返回值,最低位字节被使用。EXIT_SUCCESS和EXIT_FAILURE表示0,1
函数没返回值
#include <unistd.h>
void _exit(int status);
参数:status 进程退出码
函数没返回值
#include <stdlib.h>
void _Exit(int status);
参数:status 进程退出码
没返回值
正常终止前:
1.调用实现通过atexit或on_exit函数正常的退出处理函数
2.冲刷(printf函数时/n的效果)并关闭(底层 close 文件描述符等)标准i/o流
3.删除通过tmpfile函数创建的临时文件
4._exit(status); //_exit || _Exit跳过前3过程
5.关闭文件描述符
6.子进程给init进程
7.父进程发送SIGCHLD(17)信号
8.终止进程,将status作为退出码保存在终止状态中
异常终止(信号导致)前31个堵塞时信号会丢失
#include <stdlib.h>
void abort(void);
功能:向调用进程发送6号信号| 编号 | 名称 | 说明 | 默认操作 |
|---|---|---|---|
| 1 | SIGHUP | 进程的控制终端关闭(用户登出) | 终止 |
| 2 | SIGINT | 用户中断(Ctrl+C) | 终止 |
| 3 | SIGQUIT | 用户退出符(Ctrl+\) | 终止+转储 |
| 4 | SIGILL | 非法指令 | 终止+转储 |
| 5 | SIGTRAP | 断点/跟踪陷阱 | 终止+转储 |
| 6 | SIGABRT | 调用abort终止 | 终止+转储 |
| 7 | SIGBUS | 总线错误/未对齐访问 | 终止+转储 |
| 8 | SIGFPE | 算术异常 | 终止+转储 |
| 9 | SIGKILL | 强制终止(不可捕获) | 终止 |
| 10 | SIGUSR1 | 用户自定义信号1 | 终止 |
| 11 | SIGSEGV | 无效内存访问 | 终止+转储 |
| 12 | SIGUSR2 | 用户自定义信号2 | 终止 |
| 13 | SIGPIPE | 向无读端管道写 | 终止 |
| 14 | SIGALRM | 闹钟定时器到期 | 终止 |
| 15 | SIGTERM | 终止请求 | 终止 |
| 16 | SIGSTKFLT | 协处理/栈故障(过时) | 终止 |
| 17 | SIGCHLD | 子进程状态改变 | 忽略 |
| 18 | SIGCONT | 继续执行(若已停止) | 继续 |
| 19 | SIGSTOP | 停止(不可捕获) | 停止 |
| 20 | SIGTSTP | 终端停止(Ctrl+Z) | 停止 |
| 21 | SIGTTIN | 后台进程读终端 | 停止 |
| 22 | SIGTTOU | 后台进程写终端 | 停止 |
| 23 | SIGURG | 套接字带外数据 | 忽略 |
| 24 | SIGXCPU | CPU时间超限 | 终止+转储 |
| 25 | SIGXFSZ | 文件大小超限 | 终止+转储 |
| 26 | SIGVTALRM | 虚拟定时器到期 | 终止 |
| 27 | SIGPROF | 统计/性能定时器到期 | 终止 |
| 28 | SIGWINCH | 窗口大小改变 | 忽略 |
| 29 | SIGIO | I/O事件通知 | 终止 |
| 30 | SIGPWR | 电源故障 | 终止 |
| 31 | SIGSYS | 错误的系统调用 | 终止+转储 |
| 34 | SIGRTMIN | 实时信号最小值 | 终止 |
| 35 | SIGRTMIN+1 | 实时信号 | 终止 |
| 36 | SIGRTMIN+2 | 实时信号 | 终止 |
| 37 | SIGRTMIN+3 | 实时信号 | 终止 |
| 38 | SIGRTMIN+4 | 实时信号 | 终止 |
| 39 | SIGRTMIN+5 | 实时信号 | 终止 |
| 40 | SIGRTMIN+6 | 实时信号 | 终止 |
| 41 | SIGRTMIN+7 | 实时信号 | 终止 |
| 42 | SIGRTMIN+8 | 实时信号 | 终止 |
| 43 | SIGRTMIN+9 | 实时信号 | 终止 |
| 44 | SIGRTMIN+10 | 实时信号 | 终止 |
| 45 | SIGRTMIN+11 | 实时信号 | 终止 |
| 46 | SIGRTMIN+12 | 实时信号 | 终止 |
| 47 | SIGRTMIN+13 | 实时信号 | 终止 |
| 48 | SIGRTMIN+14 | 实时信号 | 终止 |
| 49 | SIGRTMIN+15 | 实时信号 | 终止 |
| 50 | SIGRTMAX-14 | 实时信号 | 终止 |
| 51 | SIGRTMAX-13 | 实时信号 | 终止 |
| 52 | SIGRTMAX-12 | 实时信号 | 终止 |
| 53 | SIGRTMAX-11 | 实时信号 | 终止 |
| 54 | SIGRTMAX-10 | 实时信号 | 终止 |
| 55 | SIGRTMAX-9 | 实时信号 | 终止 |
| 56 | SIGRTMAX-8 | 实时信号 | 终止 |
| 57 | SIGRTMAX-7 | 实时信号 | 终止 |
| 58 | SIGRTMAX-6 | 实时信号 | 终止 |
| 59 | SIGRTMAX-5 | 实时信号 | 终止 |
| 60 | SIGRTMAX-4 | 实时信号 | 终止 |
| 61 | SIGRTMAX-3 | 实时信号 | 终止 |
| 62 | SIGRTMAX-2 | 实时信号 | 终止 |
| 63 | SIGRTMAX-1 | 实时信号 | 终止 |
| 64 | SIGRTMAX | 实时信号最大值 | 终止 |
注册退出处理函数
#include <stdlib.h>
int atexit(void (*function)(void));
参数:function 函数指针,指向退出处理函数
返回值:成功0,失败非0
int on_exit(void(*function)(int ,void*),void* arg);
参数:function 函数指针,指向退出处理函数,第一个参数来自传递给exit函数的status或在main函数执行return的返回值
arg 将第二个参数传递给functon指向的退出处理函数
返回值:成功0,失败-1进程回收
#include <sys/wait.h>
pid_t wait(int* status); 阻塞运行
功能:等待并回收任意子进程
参数:status 函数运行成功才输出子进程终止状态,可置NULL
返回值:成功返回所回收子进程的PID,失败-1
返回值-1且置errno为ECHILD表示无子进程
#include <sys/wait.h>
pid_t waitpid(pid_t pid,int* status,int options);
功能:等待并回收任意或特定子进程
参数:pid
-1 等待并回收任意子进程,相当于wait函数
>0 等待并回收特定子进程
status 输出子进程终止状态,置NULL不输出
options
0 阻塞模式
WNOHANG 非阻塞模式,子进程仍在运行返回0
返回值:成功返回子进程PID或0,失败-1
WIFEXITED(status)
真(1) 正常终止
假(0) 异常终止
WIFSIGNALED(status)
真(1) 异常终止
假(0) 正常终止
WEXITSTATUS(status)
进程退出码
WTERMSIG(status)
终止进程的信号
WIFSTOPPED(status)
子进程被信号“暂停”(可继续)