随笔小屋 Logo
首页
瞬间
反馈
随笔小屋 Logo
首页 瞬间 反馈
  1. 首页
  2. linux
  3. 进程

进程

  • linux
  • 发布于 2025-10-01
  • 173 次阅读
flor
flor
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)
子进程被信号“暂停”(可继续)

湘ICP备2025147565号-1
gongan beian 湘公网安备43102602000213号
CPU --% | 内存 0.00G/0.00G (0%) | 网络 无活动网卡
服务器资源占用 更新时间 --:--:--