1.进程查看
eg:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
pid_t pid;
pid = fork();
if(pid < 0)
{
perror("fork\n");
exit(-1);
}
else if(pid == 0)
{
int i = 5;
while(i--)
{
printf("child is runing %d\n",i);
sleep(1);
}
printf("child is dead\n");
}
else
{
int j = 4;
while(j--)
{
printf("parent is runing %d\n",j);
sleep(1);
}
printf("parent is dead\n");
}
return 0;
}
上面代码创建一个父进程和子进程,代码运行结果如下
那么怎么查看进程呢?
- 方式一
其中10826为父进程id,10827为子进程id
ps aux | head -n1
作用:打印显示所有包含其他使用者的进程,打印出第一行信息
ps:显示当前运行中进程的相关信息
a:与终端有关的进程
x:与终端无关的进程
u:与用户有关的进程
即:
ps aux | grep a.out
作用:打印显示所有包含其他使用者的进程,再利用一个管道符号导向到
grep去查找a.out进程
即:
方式二
ps -ef
-e : 在命令执行后显示环境
-f : 完整显示输出
-ef 选项的 ps,返回系统中所有用户的所有进程的完整列表。
一般将此 ps 命令的结果通过管道传送到 grep 中
PPID为父进程id,其中可以看出10826为10827父进程id
- 简单说一下如何杀死进程
1: kill -9 进程pid
eg:kill -9 10826 杀死父进程
2:ps -ef | grep firefox | awk ‘{print $2}’ | xargs kill -9 杀掉所有进程其中awk ‘{print $2}’ 的作用就是打印(print)出第二列的内容。可以知道ps输出的第二列正好是PID。就把进程相应的PID通过xargs传递给kill作参数,杀掉对应的进程。
2.进程调试
2.1:单进程调试
1:follow-fork-mode
gdb默认调试父进程,调试器选项如下:
set follow-fork-mode mode
(其中mode为可选值,parent和child,默认为父进程)
info inferiors 查询正在调试的进程
inferior processnum 切换进程
2.1:多进程调试
2:detach-on-fork
follow-fork-mode detach-on-fork 参数说明
parent on 只调试主进程(GDB默认)
child on 只调试子进程
parent off 同时调试两个进程,gdb跟主进程,子进程block在fork位置
child off 同时调试两个进程,gdb跟子进程,主进程block在fork位置
用法:
set follow-fork-mode [parent|child]
set detach-on-fork [on|off]
调试过程:
3.线程查看
//查看当前运行的轻量级进程
ps -aL
LWP:代表是轻量级进程
4.线程调试
4.1:进入gdb调试中
将进程附加到gdb调试器当中,查看是否创建了新线程:gdb attach 主线程ID
4.2:查看线程信息
1.查看进程:info inferiors
2.查看线程:info threads
3.查看线程栈结构:bt
4.切换线程:thread n(n代表第几个线程)
4.3:设置断点,并执行线程3的函数,指行完毕继续运行到断点处
继续使某一线程运行:thread apply 1-n(第几个线程) n
4.4:只运行当前线程
1. 设置:set scheduler-locking on
2. 单步运行:n
4.5:所有线程同步执行
设置:set scheduler-locking off
5:总结命令
指令 | 含义 |
---|---|
set follow-fork-mode mode | 单进程调试其中mode为可选值,parent和child,默认为父进程) |
set follow-fork-mode [parent/child] | 多进程调试 |
info inferiors | 查询正在调试的进程 |
inferior processnum | 切换进程 |
info threads | 查看线程 |
bt | 查看线程栈结构 |
thread n(n代表第几个线程 | 切换线程 |
thread apply 1-n(第几个线程) n | 继续使某一线程运行 |
set scheduler-locking on | 只运行当前线程 |
set scheduler-locking off | 所有线程同步执行 |