Linux Day07

一、僵死進程

1.1僵死進程產生的原因

?????? 子進程先于父進程結束, 而父進程沒有獲取子進程退出碼,釋放子進程占用的資源,此時子進程將成為一個僵死進程。

在第一個框這里時父進程子進程都沒有結束,顯示其pid 父進程是2349,子進程是2350

在第二個框這里時父進程沒有結束,子進程結束,因此顯示父進程的pid,但是因為父進程沒有獲取子進程的退出碼,子進程就處于僵死狀態<defunct>

第三個框這里父進程結束,父進程成功獲取子進程的退出碼,子進程結束。

1.2 PCB消失的條件

?????? 獲取到退出碼,子進程要父進程獲取子進程的退出碼才能完全結束。


1.3危害

??????? 占用資源空間。如果進程不調用wait/waitpid,那么保留的那段信息就不會被釋放,其進程號就會一 直被占用,但是系統能使用的進程號是有限的,如果產生大量的僵死進程,將因為沒有可用的進程號而 導致系統不能產生新的進程。

1.4 如何處理

1.父進程調用wait()方法獲取子進程的退出碼

wait(&val):執行該指令,會將子進程的退出碼填到val中。

結果:

這個時候我們不難發現:先打印的都是子進程,父進程一點都沒有打印,當子進程結束才開始父進程,等val退出碼打印后才開始。

原因:wait,即先阻塞父進程,直至子進程運行結束,父進程獲取到子進程的退出碼后,父進程才繼續運行。


wait(&val):返回值pid_t,調用函數后會將退出碼通過指針賦值到val上。
WIFEXITED(val):由于退出碼為1字節,val為4字節,通過該函數可以將其轉化為1字節,返回值為bool類型,判斷進程是否正常結束。
WEXITSTATUS(val):獲取進程退出狀態。

2.父進程先結束----孤兒進程

結果

?在父進程結束后出現了提示符,但是此時子進程還沒有結束,所以還在執行

第一個框,父進程的id為2621,他的父進程是2135,子進程的id為2622,他的父進程為2621

父進程結束后,會隨機為子進程分配一個父進程,該父進程的id為1536,收養了這個孤兒進程

注意:老版本是 init進程,其進程號為1,新版本是隨機分配一個系統進程

init進程一定會對子進程執行wait()指令,獲取子進程的退出碼,子進程的pcb被操作系統刪除,至此子進程徹底結束。

1.5 練習

1.5.1? 練習一

結果

原因

板塊一:此時i=0,執行fork語句生成板塊2,打印第一個A,此時i++變成1,然后繼續循環,執行fork語句,生成板塊3(板塊三的i是從1開始的),打印第二個A,i++變成2,結束板塊一

板塊三:因為是子進程,從fork語句后執行,打印第一個A,i++變成2,結束板塊三

板塊二:也是子進程,從fork語句后執行,打印第一個A,i++變成1,繼續循環,執行fork語句生成板塊四(板塊四的i是從1開始的),打印第二個A,i++變成2,結束板塊二。

板塊四:也是子進程,打印第一個A,i++變成 2,結束板塊2.

總計:6個A

?1.5.2 練習二

?

結果

原因

注意一點:fork()執行完后,子進程從fork語句后執行

第一個板塊:執行fork語句生成板2,此時將打印的A放在緩沖區,為什么呢?可以看下linux day06講printf這塊,此時i++變成1,繼續循環,執行fork語句生成板塊3,(注意板塊三內容有原先父進程的緩沖區:A和i=1),然后執行printf,此時板塊1的緩沖區中有AA兩個,i++等于2,結束板塊1.

第三個板塊:因為復制了板塊1的,i從1開始,直接執行printf語句,緩沖區有AA兩個,i++變成2,j結束板塊3.

第二個板塊:因為是板塊1的子進程,從printf處執行,緩沖區有一個A,i++等于1,繼續for循環,執行fork語句形成板塊4,然后緩沖區:AA,i++->2,結束板塊2

第四個板塊:因為復制了板塊2,從printf處執行,緩沖區:AA,i++ ->2結束板塊4

所以總計8個A

?

?注意:練習一和練習二最大的區別在于緩存區的刷新

1.5.3 練習三

結果

?原因

首先執行fork()||fork()語句,復制了一份,因為父進程的id>0,根據或語句特點直接結束,打印第一個A。然后子進程中0||fork(),或語句如果第一個為1 就直接跳過了,但是為0 就要繼續執行后面語句,因此復制了一份代碼,由于第二個fork()返回了當前父進程的id,直接結束語句,打印第二個A。最后子進程的pid為0,所以返回值為0,0||0為假,打印最后一個A結束整個程序,所以打印三個A

?

二、操作文件的系統調用

在C語言中有fopen,fclose等文件操作

頭文件:#include<fcntl.h>

2.1 open()

?文件已存在:int open(const char *pathname, int flags);
?文件之前不存在,需要創建:int open(const char *pathname, int flags, mode_t mode);

pathname :將要打開的文件路徑和名稱
flags : 打開標志,如 O_WRONLY 只寫打開??? O_RDONLY 只讀打開
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? O_RDWR 讀寫方式打開?? O_CREAT 文件不存在則創建? ?
????????????????????????????????? O_APPEND 文件末尾追加? O_TRUNC 清空文件,重新寫入
mode : 權限 如:“0600”? 0是八進制,6是4 r+2 w
返回值: 為文件描述符

2.2 read()

從文件中提取數據

ssize_t read( int fd, void * buf, size_t count);
fd 對應打開的文件描述符
buf 存放數據的空間
count 計劃一次從文件中讀多少字節數據?
返回值 :為實際讀到的字節數

2.3 write()

從文件中寫入數據

ssize_t write( int fd, const void * buf, size_t count);
參數介紹
fd 對應打開的文件描述符
buf 存放待寫入的數據
count 計劃一次向文件中寫多少數據

2.4 close()

關閉文件

int close( int fd);
參數介紹 :
fd 要關閉的文件描述符

2.5 舉例

2.5.1 寫文件

?fd:文件描述符,通過編號id可以找到文件,0 標準輸入,1標準輸出,2標準錯誤輸出

所以fd值為3

2.5.2 讀文件

2.6? 父進程先打開一個文件,fork 后子進程是否可以共享使用?

2.6.1 文件表

?當不使用file.txt,把三關閉了,如果打開另外一個文件,則繼續復用三。(不使用就關閉,這樣就不會一直占用,使表不變大)

2.6.2 先open后fork

2.6.1.2 結果:

?父進程打開的文件,子進程也可以訪問,并且共享文件偏移量,如果想要關閉文件,需要父子進程都關閉文件。

2.6.1.3原因

父子進程共用一個結構體,引用計數為2,所以文件偏移量+1,那么子進程就輸出d,再+1,父進程輸出,所以結果出現四個偏移。

2.6.3 先fork后open

2.6.2.2 結果

?

2.6.2.3 原因

?

?因為父和子進程各有一個結構體,打開一個文件,其偏移量并不互相影響,所以都是從a開始。

三、系統調用與庫函數的區別

庫函數的實現在函數庫中,屬于用戶空間,系統調用的實現在內核中,屬于內核空間。

?

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

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

相關文章

【Nginx】Nginx網站服務

國外主流還是使用apache&#xff1b;國內現在主流是nginx&#xff08;并發能力強&#xff0c;相對穩定&#xff09; nginx&#xff1a;高性能、輕量級的web服務軟件 特點&#xff1a; 1.穩定性高&#xff08;沒apache穩&#xff09;&#xff1b; 2.系統資源消耗比較低&#xf…

Failed to set locale, defaulting to C.UTF-8 或者中文系統語言轉英文系統語言

CentOS 8中執行命令&#xff0c;出現報錯&#xff1a;Failed to set locale, defaulting to C.UTF-8報錯原因&#xff1a; 1、沒有安裝相應的語言包。2、沒有設置正確的語言環境。 解決方法1&#xff1a;安裝語言包 設置語言環境需使用命令 localelocale -a 命令&#xff0c;查…

代碼隨想錄day02

977.有序數組的平方 ● 力扣題目鏈接 ● 給你一個按 非遞減順序 排序的整數數組 nums&#xff0c;返回 每個數字的平方 組成的新數組&#xff0c;要求也按 非遞減順序 排序。 思路 ● 暴力排序&#xff0c;時間復雜度O(n nlogn) ● 使用雙指針&#xff0c;時間復雜度O(n) …

Vue中使用v-bind:class動態綁定多個類名

Vue.js是一個流行的前端框架&#xff0c;它可以幫助開發者構建動態交互的UI界面。在Vue.js開發中&#xff0c;經常需要動態綁定HTML元素的class&#xff08;類名&#xff09;屬性&#xff0c;以改變元素的外觀和行為。本文將介紹采用v-bind:class指令在Vue中如何動態綁定多個類…

【大數據】-- 本地部署 Flink kubernetes operator

目錄 1.說明 1.1 版本 1.2 kubernetes 環境 1.3 參考 2.安裝步驟 2.1 安裝本地 kubernetes 環境

判斷鏈表有環的證明

目錄 1.問題 2.證明 3.代碼實現 1.問題 給你一個鏈表的頭節點 head &#xff0c;判斷鏈表中是否有環。 如果鏈表中有某個節點&#xff0c;可以通過連續跟蹤 next 指針再次到達&#xff0c;則鏈表中存在環。 為了表示給定鏈表中的環&#xff0c;評測系統內部使用…

TansUNet代碼理解

首先通過論文中所給的圖片了解網絡的整體架構&#xff1a; vit_seg_modeling部分 模塊引入和定義相關量&#xff1a; # codingutf-8 # __future__ 在老版本的Python代碼中兼顧新特性的一種方法 from __future__ import absolute_import from __future__ import division fr…

新基建助推數字經濟,CosmosAI率先布局AI超算租賃新紀元

倫敦, 8月14日 - 在英國倫敦隆重的Raffles OWO舉辦的歐盟數字超算新時代戰略合作簽約儀式&#xff0c;CosmosAI、Infinite Money Fund與Internet Research Lab三方強強聯手&#xff0c;達成了歷史性的合作協議&#xff0c;共同邁向超算租賃新紀元。 ? 這次跨界的合作昭示了全球…

Session基礎

文章目錄 什么是Sessionsession與cookie的區別和聯系Session的存Session的取 什么是Session 服務器為每個用戶瀏覽器創建一個會話對象&#xff08;session對象&#xff09;&#xff0c;一個瀏覽器只能產生一個session當新建一個窗口訪問服務器時&#xff0c;還是原來的那個ses…

VR家裝提升用戶信任度,線上體驗家裝空間感

近些年&#xff0c;VR家裝逐漸被各大裝修公司引入&#xff0c;VR全景裝修的盛行&#xff0c;大大增加了客戶“所見即所得”的沉浸式體驗感&#xff0c;不再是傳統二維平面的看房模式&#xff0c;而是讓客戶通過視覺、聽覺、交互等功能更加真實的體驗家裝后的效果。 對于傳統家裝…

本地Linux 部署 Dashy 并遠程訪問教程

文章目錄 簡介1. 安裝Dashy2. 安裝cpolar3.配置公網訪問地址4. 固定域名訪問 轉載自cpolar極點云文章&#xff1a;本地Linux 部署 Dashy 并遠程訪問 簡介 Dashy 是一個開源的自托管的導航頁配置服務&#xff0c;具有易于使用的可視化編輯器、狀態檢查、小工具和主題等功能。你…

JS如何向數組中添加數組

常見的辦法有 1、push()方法 var arr [a, b, c,d]; arr.push(e); console.log(arr); // [a, b, c, d,e] 2、concat()方法 var arr1 [a, b, c]; var arr2 [d, e, f]; var arr3 arr1.concat(arr2); console.log(arr3); // [a, b, c, d, e, f] 3、可以使用ES6中的spread操作符…

【git】Fork或者git clone克隆了別人項目,如何保持與原項目同步更新

Fork或者git clone克隆了別人項目&#xff0c;如何保持與原項目同步更新 #mermaid-svg-LC920CR873UxZJC3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-LC920CR873UxZJC3 .error-icon{fill:#552222;}#mermaid-svg-…

BUUCTF 還原大師 1

題目描述&#xff1a; 我們得到了一串神秘字符串&#xff1a;TASC?O3RJMV?WDJKX?ZM,問號部分是未知大寫字母&#xff0c;為了確定這個神秘字符串&#xff0c;我們通過了其他途徑獲得了這個字串的32位MD5碼。但是我們獲得它的32位MD5碼也是殘缺不全&#xff0c;E903???4D…

【Vue3】自動引入插件-`unplugin-auto-import`

Vue3自動引入插件-unplugin-auto-import&#xff0c;不必再手動 import 。 自動導入 api 按需為 Vite, Webpack, Rspack, Rollup 和 esbuild 。支持TypeScript。由unplugin驅動。 插件安裝&#xff1a;unplugin-auto-import 配置vite.config.ts&#xff08;配置完后需要重啟…

迪瑞克斯拉算法 — 優化

在上一篇迪瑞克斯拉算法中將功能實現了出來&#xff0c;完成了圖集中從源點出發獲取所有可達的點的最短距離的收集。 但在代碼中getMinDistanceAndUnSelectNode()方法的實現并不簡潔&#xff0c;每次獲取minNode時&#xff0c;都需要遍歷整個Map&#xff0c;時間復雜度太高。這…

stable diffusion安裝包和超火使用文檔及提示詞,數字人網址

一&#xff1a;文生圖、圖生圖 1&#xff1a;stable diffusion&#xff1a;對喜歡二次元、美女小姐姐、大眼萌妹的人及其友好哈哈(o^^o) 1&#xff09;&#xff1a;關于安裝包和模型包&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/11_kguofh76gwhTBPUipepw 提取碼…

HTML詳解連載(5)

HTML詳解連載&#xff08;5&#xff09; 專欄鏈接 [link](http://t.csdn.cn/xF0H3)下面進行專欄介紹 開始嘍行高&#xff1a;設置多行文本的間距屬性名屬性值行高的測量方法 行高-垂直居中技巧 字體族屬性名屬性值示例擴展 font 復合屬性使用場景復合屬性示例注意 文本縮進屬性…

阿里云國際站對象儲存OSS的常見問題?

1.什么是阿里云OSS&#xff1f; 阿里云對象存儲服務OSS&#xff08;Object Storage Service&#xff09;&#xff0c;是阿里云提供的海量、安全、低成本、高持久性的云存儲服務&#xff0c;并可無限擴展。其數據設計持久性不低于99.9999999999%&#xff08;12個9&#xff09;&a…

UG NX二次開發(C#)-CAM自定義銑加工的出口環境

文章目錄 1、前言2、自定義銑削加工操作3、出錯原因4、解決方案4.1 MILL_USER的用戶參數4.2 采用自定義銑削的方式生成自定義的dll4.2 配置加工的出口環境4.3 調用dll5、結論1、前言 作為一款大型的CAD/CAM軟件, UG NX為我們提供了豐富的加工模板,通過加工模板能直接用于生成…