Linux操作系统从入门到实战(十八)在Linux里面怎么查看进程

Linux操作系统从入门到实战(十八)在Linux里面怎么查看进程


前言

  • 上一篇博客里我们讲解了进程与进程的基本概念
  • 这篇博客我们开始讲解在Linux里面怎么查看进程

我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343

我的Linux知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12879535.html?spm=1001.2014.3001.5482


.

一、如何识别一个进程?------ PID

前面我们知道每个进程都有一个唯一的"身份证号",叫PID(进程标识符)。

  • 当我们写了一段代码,想知道它运行时的PID,可以用getpid()函数获取:
c 复制代码
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    pid_t id = getpid();  // 获取当前进程的PID
    printf("我的PID是:%d\n", id);  // 打印PID
    return 0;
}

编译后用./myprocess运行,就能看到它的PID了。

二、怎么查看进程的信息?

知道了PID,我们可以通过两种方式查看进程的详细信息:

方式1:通过/proc目录

Linux系统里有个特殊的/proc目录,里面存放着所有正在运行的进程的信息,每个进程的信息都放在以它的PID命名的文件夹里。

比如你的进程PID是1,可以用:

bash 复制代码
ls /proc/1  # 查看这个进程的详细信息

如果用ctrl+c终止了进程,再看/proc/12345就会发现这个文件夹消失了------因为进程已经没了。

另外,每次重新运行程序,PID会变(就像每次重启软件,它的"身份证号"会换一个)。

方式2:用ps命令

ps是专门查看进程的命令,配合grep可以快速找到你关心的进程。

比如想找名为myprocess的进程:

bash 复制代码
ps axj | grep "myprocess"  # axj表示显示详细信息,grep过滤出包含myprocess的行

如果想先看一下ps命令的输出格式,可以加head -1显示表头:

bash 复制代码
ps axj | head -1  # 只显示第一行(表头)

三、父进程是什么?------ PPID

每个进程不仅有自己的PID,还有一个"父PID(PPID)",表示它是由哪个进程创建的。

比如你可以用getppid()函数获取当前进程的父进程PID:

c 复制代码
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int main() {
    pid_t pid = getpid();    // 自己的PID
    pid_t ppid = getppid();  // 父进程的PID
    printf("我的PID:%d,父进程PID:%d\n", pid, ppid);
    return 0;
}

运行后会发现,每次用命令行(比如终端)启动./myprocess,它的父进程PID基本不变------因为这个父进程是bash

四、bash是什么?

  • bash就是你打开的终端(命令行界面)本身对应的进程。

  • 我们在终端里输入的所有命令(比如ls./myprocess),最终都会被bash创建成一个新进程来执行。

  • 所以我们运行的myprocess,父进程自然就是bash

五、如何创建子进程?------ fork函数

bash能创建子进程(比如你的myprocess),那我们自己的程序能不能创建子进程呢?可以用fork()函数。

1. fork的用法

看一段简单的代码:

c 复制代码
#include <stdio.h>
#include <unistd.h>  
#include <sys/types.h>

int main() {
    printf("我是原始进程,PID:%d,PPID:%d\n", getpid(), getppid());

    // 创建子进程
    fork();

    sleep(1);  // 等1秒,让输出更清晰
    printf("这句话会被打印几次?\n");

    return 0;
}

编译后运行./myprocess,会发现"这句话会被打印几次?"出现了两行------因为fork()创建了一个子进程,原始进程(父进程)和新创建的子进程都会执行fork()之后的代码。

2. 关于fork的三个关键问题

  1. fork的返回值有两个?

    是的。fork()成功后:

    • 父进程会得到子进程的PID(一个大于0的数);
    • 子进程会得到0。
  2. 为什么一个函数会有两个返回值?

    因为fork()创建子进程后,会复制父进程的代码和数据(默认共享),但父进程和子进程会"分头"继续执行。所以fork()之后,相当于有两个"程序"在跑,各自拿到了一个返回值。

  3. 同一个变量怎么会既等于0又大于0?

    虽然父子进程共享代码,但数据是独立的 。比如fork()的返回值存到变量ret里,父进程的ret是子进程PID(>0),子进程的ret是0------它们各自的ret是独立的,互不影响。这是为了保证进程之间的数据不冲突。


以上就是这篇博客的全部内容,下一篇我们将继续探索Linux的更多精彩内容。

我的个人主页

欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343

我的Linux知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12879535.html?spm=1001.2014.3001.5482

|--------------------|
| 非常感谢您的阅读,喜欢的话记得三连哦 |

相关推荐
TH_120 小时前
腾讯云-(3)-Linux宝塔面板使用
linux·云计算·腾讯云
虚伪的空想家20 小时前
arm架构服务器使用kvm创建虚机报错,romfile “efi-virtio.rom“ is empty
linux·运维·服务器·javascript·arm开发·云原生·kvm
火车头-11020 小时前
【docker 部署nacos1.4.7】
运维·docker·容器
深藏bIue20 小时前
linux服务器mysql目录下的binlog文件删除
linux·服务器·mysql
虾..21 小时前
Linux 进程状态
linux·运维·服务器
测试者家园21 小时前
DevOps 到底改变了测试什么?
运维·自动化测试·软件测试·devops·持续测试·智能化测试·软件测试和开发
扛枪的书生21 小时前
Linux 通用软件包 AppImage 打包详解
linux
只想安静的写会代码1 天前
网卡信息查询、配置、常见故障排查
linux·服务器·windows
jiayong231 天前
多子系统架构下的Nginx部署策略与最佳实践
运维·nginx·系统架构
皮糖小王子1 天前
Docker打开本地镜像
运维·docker·容器