Linux进程相关知识

本文介绍了Linux中的进程和线程概念,如QQ、微信等应用在任务管理器中表现为进程,而360的各项功能则为线程。通过`ps`命令可以查看进程,`getpid()`获取进程ID,`fork()`创建子进程。文章还讨论了僵死进程和孤儿进程的情况以及处理方法。
摘要由CSDN通过智能技术生成

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托管)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值