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()
函数获取:
#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
,可以用:
ls /proc/1 # 查看这个进程的详细信息
如果用ctrl+c
终止了进程,再看/proc/12345
就会发现这个文件夹消失了——因为进程已经没了。
另外,每次重新运行程序,PID会变(就像每次重启软件,它的“身份证号”会换一个)。
方式2:用ps命令
ps
是专门查看进程的命令,配合grep
可以快速找到你关心的进程。
比如想找名为myprocess
的进程:
ps axj | grep "myprocess" # axj表示显示详细信息,grep过滤出包含myprocess的行
如果想先看一下ps
命令的输出格式,可以加head -1
显示表头:
ps axj | head -1 # 只显示第一行(表头)
三、父进程是什么?—— PPID
每个进程不仅有自己的PID,还有一个“父PID(PPID)”,表示它是由哪个进程创建的。
比如你可以用getppid()
函数获取当前进程的父进程PID:
#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的用法
看一段简单的代码:
#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的三个关键问题
fork的返回值有两个?
是的。fork()
成功后:- 父进程会得到子进程的PID(一个大于0的数);
- 子进程会得到0。
为什么一个函数会有两个返回值?
因为fork()
创建子进程后,会复制父进程的代码和数据(默认共享),但父进程和子进程会“分头”继续执行。所以fork()
之后,相当于有两个“程序”在跑,各自拿到了一个返回值。同一个变量怎么会既等于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
非常感谢您的阅读,喜欢的话记得三连哦 |