[Linux]進程 / PID

一、認識進程 --- PCB

寫一個死循環程序執行起來,觀察進程

ps ajx? ? ? ? 顯示所有進程

用分號可以在命令行的一行中執行多條指令,也可以用 && :

ps ajx | head -1 && ps ajx | grep proc

終止掉進程后再查看:

所以 ./proc 就是死循環程序運行的進程

grep --color=auto proc 之所以一直都在,是因為命令行指令執行時也是一個進程

ps ajx | grep proc 執行時,grep 指令也變成了一個進程,查詢結果自然就會包含在內

可以用 grep 的 -v 選項反向搜索來不顯示這個進程:

進程可以分為兩種:一是執行完就退出的,例如指令,二是用戶不關就不退的,被稱為常駐進程,例如殺毒軟件。

二、進程屬性 --- task_struct 內容分類

1. PID

PID 是進程的標示符,用于唯一標識一個進程。

可以用 getpid()?來獲取進程的 PID:(需要 sys/types.h 頭文件)

2.kill

kill 是一條進程相關的指令,有許多選項:

通過 -9 或 -SIGKILL 可以關閉一個進程:

kill -9 <PID>

3. ?/proc

Linux 中一切皆文件,所以進程的屬性也以文件的形式可供用戶查看

這里以數字命名的每個目錄都代表著一個進程,里面的文件都是這個進程相關的屬性

其中:

(1)exe

exe 是一個鏈接文件,標識了這個進程來源于哪個可執行程序

如果我們刪掉 proc 文件,就會變成:

注意此時進程之所以還在進行,還有這個進程的目錄,是因為我們的刪除操作刪除掉的是磁盤中的 proc 文件,而進程是內存級的,只要不停止運行就會一直在。

(2)cwd

current work directory “當前工作目錄”的縮寫

進程剛剛創建時,會用自己的 cwd 屬性記錄下程序所在的目錄作為默認的“當前路徑”

如果我們在程序中用 fopen 打開一個新 log.txt 文件,運行后就會在當前路徑下創建出一個 log.txt 文件。這個“當前路徑”,就來自于進程的 cwd 屬性。

而且這個文件被新建時,創建的路徑使用的是絕對路徑,是用進程的 cwd 和文件名拼接成的:/home/mmr/linux-c/par02/log.txt

想要改變進程的 cwd,可以用 chdir()

就可以把進程的 cwd 更改為根目錄,log.txt 也就可以新建在根目錄下了(注意普通用戶沒有根目錄的寫權限,所以普通用戶會創建失敗)

(3)/proc是內存級文件

/proc 并不存儲在硬盤當中,關機時整個文件被釋放掉,不會存儲。

4.PPID

在 Linux 系統中,系統啟動之后,新創建的任何進程,都是由自己的父進程創建的。

PPID 就是父進程的 PID 。

可以用 getppid() 來獲取進程的 ppid

可以看到 ppid 一直是相同的,我們查看一下:

可以看到這個進程是 bash,叫做命令行解釋器,是 Linux 系統的shell?外殼

命令行中,執行指令、執行程序,本質都是 bash 的進程,創建的子進程,由子進程來執行代碼

用戶每一次登錄,系統都會為用戶創建一個 bash 進程,這里 bash 前有一個 "-",代表當前這個用戶是使用命令行終端進行登錄的。

三、使用系統調用,創建進程 ---?fork

我們運行一下:

可以看到 child proc 打印了兩遍。

這是因為 fork 創建出子進程后,原先的進程和子進程都要運行。原先的進程的父進程是 bash,子進程的父進程是原先的進程。

這兩個進程先后連續創建的,所以 pid 也是連續的。

由 fork 的返回值可以知道,如果子進程創建成功,那么在原先的進程中,獲得的返回值是子進程的 pid,而子進程中獲得的 fork 返回值是 0

fork 創建的子進程,與其父進程共享同一份代碼,但是數據是各自私有一份的,互不干擾。

父進程的代碼,是由硬盤加載進內存后運行的,而子進程的代碼,是直接共享自父進程的,而非從硬盤中加載得來。

所以說,進程具有很強的獨立性。

多個進程之間,運行時,是互不影響的。

四、創建多個進程

1. C++

Linux 中 C++ 可以使用 .cpp .cc .cxx 作為后綴

使用 g++ -o <程序名> <源文件名> 生成可執行程序

如果使用了C++11中的語法:

2.創建多個進程

為什么這里子進程的 PPID 是 1 ?

因為我截這個圖時父進程已經執行完畢掛掉了,此時子進程的 PPID 就不會是原先的父進程,會被 init 進程,托管給 1 號進程。

五、再理解創建子進程

1. fork 函數為什么有兩個返回值

在 fork 函數體內部,先是父進程在走,在走的時候,子進程被創建出來,因為父子進程是共享同一份代碼的,所以這時候就是父子進程一起在走 fork 函數。

當 fork 函數運行到最后的 return 語句時,父子進程各自執行一次 return,父進程返回父進程的值,子進程返回子進程的值。又因為父子進程的數據是各自私有一份的,所以即使返回值不同也互不干預,不會有任何后果。

因此雖然一個函數有兩個返回值,但其實并不沖突。

2. fork之后,父子誰先運行

fork之后,父子進程誰先運行是不確定的,是由OS的調度器自主決定的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89747.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89747.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89747.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【人工智能99問】門控循環但單元(GRU)的結構和原理是什么?(13/99)

文章目錄GRU&#xff08;Gated Recurrent Unit&#xff09;的結構與原理一、GRU的結構與原理1. 核心組件2. 計算原理&#xff08;數學公式&#xff09;二、GRU的使用場景三、GRU的優缺點優點&#xff1a;缺點&#xff1a;四、GRU的訓練技巧五、GRU的關鍵改進六、GRU的相關知識與…

去中心化協作智能生態系統

摘要&#xff1a; 本報告深入HarmonyNet系統的工程實現細節&#xff0c;從開發者視角出發&#xff0c;提供了模塊化的組件規范、基于API的數據交互協議、可直接執行的業務邏輯流程以及經過優化的、可渲染的系統圖表。報告的核心在于將V2.0的高層架構轉化為具體的模塊接口&#…

FPGA自學——整體設計思路

FPGA自學——整體設計思路 1.設計定義 寫一套硬件描述語言&#xff0c;能夠在指定的硬件平臺上實現響應的功能 根據想要實現的功能進行設定&#xff08;如&#xff1a;讓LED一秒閃爍一次&#xff09; 2.設計輸入 方法&#xff1a; 編寫邏輯&#xff1a;使用verilog代碼描述邏輯…

ubuntu下好用的錄屏軟件

? 以下是 vokoscreen 的安裝教程,適用于 Linux 系統。vokoscreen 是一款簡單易用的屏幕錄制工具,支持錄制屏幕、攝像頭和音頻。 安裝 vokoscreen vokoscreen 提供了多種安裝方式,包括通過包管理器、Deb 包或 AppImage 文件。 方法 1:通過 apt 安裝(Ubuntu/Debian) su…

web安全漏洞的原理、危害、利用方式及修復方法

1. 原理 Web安全漏洞通常是由于Web應用程序在設計、編碼或配置過程中存在缺陷導致的。這些缺陷可能使攻擊者能夠獲取敏感數據、破壞應用程序或利用其進行其他惡意活動。2. 常見危害數據泄露&#xff1a;攻擊者可能竊取用戶的個人信息、密碼、信用卡信息等敏感數據。會話劫持&am…

Linux—Linux中的權限管理

Linux中的權限管理前言目錄一、shell命令以及運行原理二、Linux中的權限概念1、如何實現用戶賬號的切換2、如何僅提升當前指令的權限3、如何將普通用戶添加到信任列表三、Linux中的權限管理1、文件訪問者的分類&#xff08;人&#xff09;2、文件類型和訪問權限&#xff08;事物…

解決在nuxt2框架中引入swiper報錯:window is not defined

前言&#xff1a;最近幫助公司更新官網&#xff0c;我們公司為了加快首頁加載速度采用了Nuxt框架&#xff0c;但是官網首頁需要一個輪播圖&#xff0c;但是安裝之后&#xff0c;運行項目就開始報錯&#xff1a;window is not defined&#xff0c;后來查閱了資找到了報錯的原因以…

牛客NC14661 簡單的數據結構(deque雙端隊列)

題目描述 栗醬有一天在網上沖浪的時候發現了一道很有意思的數據結構題。 這個數據結構形如一個“長條形”的容器&#xff0c;一開始該容器是空的&#xff0c;有以下七種操作&#xff1a; 111 aaa&#xff1a;從前面插入一個元素 aaa 222&#xff1a;從前面刪除一個元素 333 a…

【AI大模型:架構實戰】32、DeepSpeed大模型訓練全解析:從技術原理到千億參數實戰優化指南

DeepSpeed作為微軟開源的分布式訓練框架,已成為大模型工業化訓練的核心工具。它通過系統級創新突破了單卡顯存限制,將千億參數模型的訓練成本降低75%以上,同時提升訓練速度3-8倍。 本文整合2025年最新實踐,從核心技術原理(如ZeRO優化、3D并行)到千億參數模型實戰流程,全…

GraphQL與REST在微服務接口設計中的對比分析與實踐

問題背景介紹 在微服務架構中&#xff0c;服務之間的接口設計成為系統靈活性、可維護性和性能的關鍵。傳統的REST API因其簡單、成熟的生態而得到廣泛應用&#xff0c;但在復雜業務場景下會面臨接口粒度、版本兼容、數據冗余等挑戰。GraphQL作為Facebook開源的查詢語言&#xf…

Git分支管理與Stash技巧:從基礎到高級工作流詳解

引言Git作為現代軟件開發的核心工具&#xff0c;其分支管理能力是支撐團隊協作開發的基石。本文將系統講解Git分支的創建、合并、沖突解決等基礎操作&#xff0c;深入剖析分支底層原理&#xff0c;并介紹stash暫存技巧和業界主流的分支管理策略&#xff0c;幫助開發者構建高效的…

windows wsl ubuntu 如何安裝 maven

命令 sudo apt update sudo apt install maven驗證安裝是否成功&#xff1a; $ mvn -versionApache Maven 3.6.3 Maven home: /usr/share/maven Java version: 1.8.0_402, vendor: Private Build, runtime: /usr/lib/jvm/java-8-openjdk-amd64/jre Default locale: en, platf…

Swift6.1 - 可選類型處理

目錄1、nil2、可選綁定3、提供后備值4、強制解包5、隱式解包可選在可能缺失值的情況下&#xff0c;請使用 可選。可選代表兩種可能性&#xff1a;要么 存在一個指定類型的值&#xff0c;并可以解包可選以訪問該值&#xff1b;要么 根本就沒有值。舉一個可能缺失值的例子&#x…

【數據結構】關于鏈表的面試題

一、單鏈表逆置1、法一思路&#xff1a;通過兩個輔助指針 p和 q&#xff0c;在遍歷鏈表時逐個反轉指針方向。p初始化為 第一個有效節點&#xff0c;用于遍歷原鏈表&#xff1b;q初始化為 NULL&#xff0c;用于臨時保存 p 的下一個節點。plist->next 被置為 NULL&#xff0c;…

LVS(Linux virual server)

LVS&#xff08;Linux virual server&#xff09; 系統性能擴展方式 Scale UP&#xff1a;增強單臺服務器性能&#xff0c;適合單體應用&#xff0c;但有硬件限制。 Scale Out&#xff1a;增加服務器數量&#xff0c;適合分布式和集群系統&#xff0c;可靈活擴展。 集群&#x…

在 ASP.NET Core 和 JavaScript 中配置 WebSocket

在本文中&#xff0c;我們將了解 WebSocket&#xff0c;并逐步講解如何在客戶端配置 WebSocket 并與服務器通信。首先&#xff0c;讓我們先來了解一下“ WebSocket ”。什么是 WebSocketWebSocket 是一種協議&#xff0c;它提供了一種通過持久連接在客戶端和服務器之間交換數據…

車載刷寫框架 --- 關于私有節點刷寫失敗未報引起的反思

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

ABP VNext + GitHub Actions:CI/CD 全流程自動化

&#x1f31f; ABP VNext GitHub Actions&#xff1a;CI/CD 全流程自動化 &#x1f4da; 目錄&#x1f31f; ABP VNext GitHub Actions&#xff1a;CI/CD 全流程自動化&#x1f929; TL;DR&#x1f504; 全局流程概覽1?? 準備工作與項目結構1.1 &#x1f6e0;? 工具鏈與 S…

Elasticsearch 重命名索引

作者&#xff1a;來自 Elastic Alex Salgado 學習如何使用四種實用方法在 Elasticsearch 中重命名索引。 想獲得 Elastic 認證&#xff1f;看看下一期 Elasticsearch Engineer 培訓什么時候開始&#xff01; Elasticsearch 擁有豐富的新功能&#xff0c;幫助你根據使用場景構建…

高通8255 Android Virtio Virtio-SPI 配置方法

目錄 一&#xff1a;VirtIO和Passthrough的區別 二&#xff1a;配置邏輯 三&#xff1a;配置方法 步驟一&#xff1a;QNX SPI資源配置 & 測試 配置 測試 步驟二&#xff1a;BE配置 &測試 配置 測試 步驟三&#xff1a;Hypervisor配置 配置 測試 步驟四&…