# 查看进程 ps -aux/ajx -a 显示所有进程 -u 显示详细信息 -x 显示没有控制终端的进程 -j 列出与作业控制相关的信息 # 实时显示进程动态 top -d 更新时间 在top命令执行后可以按键对显示的结果排序: M 内存 P CPU T 进程运行时长 U 用户名 K 杀死指定PID进程 # 杀死进程 kill 进程pid kill -9 进程pid # 强制杀死进程 kill -l # 列出所有信号 killall 进程name # 根据进程名杀死进程
10. 进程由进程标识号(PID)表示。任何继承(除init进程)都是由另一个进程创建,该进程称为被创建进程的父进程,对应的进程号为父进程号(PPID)。 11. 进程组是一个或多个进程的集合。它们之间相互关联,进程组可以接收同一个终端的各种信号,关联的进程有一个进程组号(PGID)。 12. 创建进程。
#include <sys/types> #include <unistd.h> pid_t fork(void); - 作用:用于创建子进程 - 返回值:fork()返回值会返回两次。一次是在父进程中,一次是在子进程中。 在父进程中返回创建的子进程的ID,在子进程中返回0。 在父进程中返回-1表示创建子进程失败,并设置errno。 ?如何区分父进程和子进程:通过fork()的返回值。 pid_t getpid(void); pid_t getppid(void);
13. fork()原理。
# 设置跟踪父进程还是子进程 set fllow-fork-mode [parent/child] # 设置调试模式 # on表示调试当前进程时,其他进程继续运行,off表示调试当前程序时其他进程被GDB挂起 set detach-on-fork [on/off] # 查看调试的进程 info inferiors # 切换当前调试的进程 inferior id # 使进程脱离GDB调试 detach inferiors id
16.exec函数族。
#include <unistd.h> int execl(const char *path, const char *arg, ...); - path: 需要指定的执行的文件的路径或名称 - arg: 执行可执行文件所需要的参数列表,第一个参数为执行程序的名称,第二个参数为程序执行所需要的参数列表,参数最后以NULL结束 - 返回值:只有调用失败才有返回值,返回-1并设置errno int execlp(const char *file, const char *arg, ...); - 作用:会到环境变量中查找指定的可执行文件,如果找到就执行,找不到就执行不成功 - file:需要执行的可执行文件的文件名 - exec("ps", "aux", NULL) int execle(const char *path, const char *arg, ...); - 指定环境变量数组,e.g.: char *envp[] = {"/home/aaa", "/home/bbb", "/bin/ps"}; - exec("/bin/ps", "aux", NULL, envp); int execv(const char *path, char *const argv[]); - 将可执行文件的参数保存在数组中,e.g.: char *argv[] = {"ps", "aux", "NULL"}; - exec("/bin/ps", argv); int execvp(const char *file, char *const argv[])' int execvpe(const char *file, char *const argv[], char *const envp[]); int execve(const char *filename, char *const argv[], char *const envp[]); l(list) 参数地址列表,空指针结尾 v(vector) 存有个参数地址的指针数组的地址 p(path) 按path环境变量指定的目录搜索可执行文件 e(environment) 存有环境变量字符串地址的指针数组的地址 18.进程控制。 子进程退出可以释放用户区的数据,但是其内核区的数据需要其父进程回收释放。 # 进程退出 #include <stdlib.h> void exit(int status); - 会调用退出处理函数,并刷新IO缓冲并关闭文件描述符后再调用Unix系统函数_exit(); - status: 进程退出时的一个状态信息。父进程回收子进程资源的时候可以获取到。 #include <unistd.h> void _exit(int status); - 不会刷新缓冲区,被C库函数exit()调用。
19.孤儿进程。
#include <sys/types.h> #include <sys/wait.h> pid_t wait(int *wstatus); - 作用:等待任意一个子进程结束,如果任意一个子进程结束,此函数会回收该子进程资源。 - wstatus: 进程退出时的状态信息,传出参数 - 返回值:成功返回被回收的子进程id;失败(所有子进程都结束、调用函数失败)返回-1 调用wait函数的进程会被挂起(阻塞),直到它的一个子进程退出或者收到一个不能被忽略的信号时才被唤醒(相当于继续往下执行), 如果没有子进程了,函数会立刻返回-1;如果子进程都结束了,也会立即返回-1。 # 推出信息相关宏函数 WIFEXITED(status) 非0,进程正常退出 WEXITSTATUS(status) 如果上宏为真,获取进程退出的状态,exit()的参数 WIFSIGNALED(status) 非0,进程异常终止 WTERMSIG(status) 如果上宏为真,获取使进程终止的信号编号 WIFSTOPPED(status) 非0,进程处于暂停状态 WSTOPSIG(status) 如果上宏为真,获取使进程暂停的信号的编号 WIFCOTINUED(status) 非0,进程暂停后已经继续运行 # e.g.: int st; int ret = wait(&st); if(ret == -1) break; if(WIFEXITED(st)) { printf("退出的状态码: %d\n", WEXITSTATUS(st)); } if(WIFSIGNALED(st)) { printf("被哪个信号干掉了:%d\n", WTERMSIG(st)); } printf("child die, pid = %d\n", ret); pid_t waitpid(pid_t pid, int *wstatus, int options); - 作用:回收指定进程号的子进程,可以设置是否阻塞 - pid: 1.pid>0,某个子进程的pid;2.pid=0,回收当前进程组的所有子进程;3.pid=-1,回收任一子进程,相当于wait();4.pid<-1,回收指定进程组(pid的绝对值)中的子进程。 - options: 设置阻塞或者非阻塞,0:阻塞;WNOHANG:非阻塞。 - 返回值:>0 返回子进程的id,=0 如果设置options=WNOHANG,表示没有子进程的状态改变;=-1 错误。