Linux进程相关知识
进程的概念
如图在任务管理器中,一个运行的应用就代表一个进程。如(QQ、微信、360)。
线程的概念
而对于360这个应用而言,它的每一项功能就是一个·线程。如(木马查杀、清理加速就是一个进程的不同的线程)。对于线程而言,它每个线程都可以独立运行,互不影响。例如(可以在进行木马查杀的时候同时进行清理加速)
查看进程
ps命令
在linux环境中,通过ps命令可以查看当前终端进程。
ps -ef查看全部进程
红线部分所画出来各项表示的含义
符号 | 表示的含义 |
---|---|
UID | 执行该进程的用户ID |
PID | 进程ID编号 (int类型) |
PPID | 该进程的父进程编号 |
C | 该进程所占cup的使用率 |
STIME | 该进程启动时间 |
TIME | 该进程运行时间,启动了多长时间 |
CMD | 进程启动时的命令 |
ps-ef|grep bin
在所有进程中过滤出含有关键字含bin的进程(相当于对bin模糊搜索)
getpid() 函数
getpid()函数的功能是获返回该程序运行时进程的pid_t编号(int类型的typedef int pid_t)。返回值为pid_t
头文件
#include<sys/types.h>
#include<unistd.h>
应用举例
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{pid_t pid=getpid();
printf(" 该程序的进程pid编号是:%d\n",pid;
}
运行结果
fork()函数
fork()函数作用就是产生一个子进程。
在c语言中,每一个完整的.c程序运行起来都是一个独立的进程,它拥有数据段、代码段、堆栈段。fork()函数就是在这个进程之上产生一个子进程,它复制了父进程的代码段,数据段。(但它与父进程拥有相互独立的变量,父进程变量+1在子进程中变量初始不会+1,只有子进程在执行到与父进程相同的+1代码才会加1)
头文件
#include<sys/types.h>
#include<unistd.h>
返回值
fork()函数有多个返回值,返回值类型时pid _t类型(本质是int类型typedef int pid_t)
在父进程中 : 它返回的是创建子进程的进程PID编号
在子进程中 :fork()返回值为0
如果出现错误则返回一个负值
实例
运行结果
可以看出在运行azp01这个程序后:它本身进程pid为20954,它通过fork产生子进程pid为20955,子进程的ppid为20954 count分别在该父进程子进程都加1
僵死(尸)进程
对于普通fork正常而言的进程都会父子进程结束。僵死进程是子进程先结束,父进程未结束。(子进程·退出,父进程未获取子进程的退出码)
实例
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main() {
pid_t pid = fork();
if (pid == 0) {
while (1) {
printf("父进程,进程PID为%d该进程父进程PPID为%d\n", getpid(), get ppid());
sleep(2);
}
}
else if (pid > 0) {
printf("子进程,进程PID为%d该进程的父进程PPID为%d\n", getpid(), getpp id());
sleep(5);
printf("子进程结束");
}
else {
printf("fork失败");
}
}
运行结果
可以看出在红线这个部分,子进程已经结束。父进程还在执行中
解决办法
(1)父进程调用wait()方法获取子进程的退出码;
(2)kill 父进程
孤儿进程
父进程已经结束,子进程还在继续运行
实例
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main() {
pid_t pid = fork();
if (pid == 0) {
while (1) {
printf("子进程,进程PID为%d该进程的父进程PPID为%d\n", getpid(), getppid());
sleep(2);
}
}
else if (pid > 0) {
printf("父进程,进程PID为%d该进程父进程PPID为%d\n", getpid(), getppid());
sleep(20);
}
else {
printf("fork失败");
}
}
运行结果
可以看出父进程结束后,子进程还在继续运行。子进程被系统进程init托管父进程号为1蓝色线(在ubunto我这个显示被1507托管)。