Linux操作系統從入門到實戰(十八)在Linux里面怎么查看進程
- 前言
- 一、如何識別一個進程?—— PID
- 二、怎么查看進程的信息?
- 方式1:通過/proc目錄
- 方式2:用ps命令
- 三、父進程是什么?—— PPID
- 四、bash是什么?
- 五、如何創建子進程?—— fork函數
- 1. fork的用法
- 2. 關于fork的三個關鍵問題
前言
- 上一篇博客里我們講解了進程與進程的基本概念
- 這篇博客我們開始講解在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(); // 獲取當前進程的PIDprintf("我的PID是:%d\n", id); // 打印PIDreturn 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(); // 自己的PIDpid_t ppid = getppid(); // 父進程的PIDprintf("我的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
非常感謝您的閱讀,喜歡的話記得三連哦 |