操作系统管理
进程:一个正在执行的程序
程序:由一条条的指令构成
pcb
进程控制块struct task_struct
int pid
唯一标识一个进程
进程状态:就绪 运行 阻塞
ps
查看进程都有啥
PID TTY TIME CMD
4833 ------------- bash
4843 --------------- ps
which ps
可以查看ps在哪里存着,结果是 /usr/bin/ps
ps -f
查看的比ps多个功能是谁执行的(如下是stu执行的)
UID — PID ---- PPID----C—STIME-----TTY ------ TIME----CMD
stu------4833—父进程PID
ps -e
查看所有的进程
ps -ef
既有所有进程,还包括谁进行的,父进程的PID(所有的终端进程都可以看到)
用户是和命令解释器进行交互的
kill +PID
结束命令
ps -ef | grep "sleep"
找到sleep的pid
sleep 10
睡眠10s
ctrl +z
暂停命令(如sleep)
jobs
可以查看在后台运行的命令(如暂停的sleep命令)
jobs -l
比jobs查看的内容多一个命令的pid
kill -9 pid
强制杀死,当sleep命令用crtl+z暂停时,kill +pid无法杀死,只有加上 -9强制杀死
pkill sleep
结束所有终端的sleep命令,不用像kill一个一个的结束命令sleep
pkill -9 sleep
强制结束命令
sleep 100&
在后台执行该命令,后台可以同时执行多个命令,这样可以继续在前台执行命令
ctrl+c
可以结束在前台运行的程序(上面的办法也可以实现前台结束程序kill pkill,它俩得重新创建一个终端),不能结束后台的。
bg %任务号
让在前台停止的命令在后台执行,jobs可以查看任务号,也就是这个命令可以将前台的命令转到后台
fg %任务号
将后台的命令拉到前台执行
kill + pid
结束后台的任务
top
相当于Windows的任务管理器,q退出
gcc的四步
在Windows上可执行程序格式为:PE
Linux可执行程序格式:ELF
gcc -E main.c -o main.i
预编译(预编译时不检查语法错误)
1.删除所有的#define,并展开所有的宏定义。
2.处理所有的条件预编译指令#if 0,#end if …
3.处理#include预编译指令,将被包含的文件插入到该预编译指令的位置,
删除所有的注释,
4.添加行号和文件名标识,以便于编译器产生调试用的符号信息及编译时产生编译错误和警告时显示行号。
5.保留所有的的#pragma编译器指令,因为编译器需要使用它们
gcc -S main.i -o main.s
编译,检查语法错误,形成汇编代码(但不取值(实参))
词法分析,语法分析,语义分析,代码优化,汇总符号
gcc -c main.s -o main.o
汇编,将汇编语言转为机器语言(二进制指令)
将汇编指令翻译成二进制格式,生成各个section,生成符号表。
gcc mian.o -o main
链接
合并各个section,调整section的起始位移和段大小,合并符号表,进行符号解析,给符号分配虚拟地址
./main
执行
gcc -o main main.c
一步完成
gcc -c main.c gcc -o main main.o
两步执行
gcc -o main main.c add.c max.c
多文件编译一步编译
gcc -c main.c /add.c/ max.c gcc -o main main.o add.o max.o
两步多文件编译
Makefile文件
all :main
main :main.o add.o max.o
gcc -o main main.o add.o max.o gcc前面为Tab键
main.o :main.c
gcc -c main.c
add.o :add.c
gcc -c add.c
max.o :max.c
gcc -c max.c
clean:
rm -f *.o main
make
执行Makefile时使用的命令
gdb 调试程序
每个进程运行后,默认会打开三个文件(类型file*
)
stdin
键盘,标准输入
stdout
屏幕 标准输出
stderr
屏幕,标准错误输出
gcc -o test test.c -g
生成debug(才可调试 )下的test文件,之前的gcc是默认生成release模式
gdb test
调试test文件,注意不是test.c
l
显示代码
b+行号
下断点
info break
查看断点信息
r
启动程序
n
单步执行
s
进入函数
f
退出函数(finish)
p
查看某个变量的值(打印)
q
退出调试
c
跳到另一断点处
set follow-fork-mode child
进入子进程调试
库文件:声明在/usr/include/stdio.h
定义:/lib/libc.so