I/O進程3

  • day3
    • 五、進程
      • 7.函數接口
        • 7.1創建子進程
          • pid_t fork(void);
          • 功能:創建子進程
          • 返回值:成功:在父進程中:返回子進程的進程號 >0 ?在子進程中:返回值為0;? 失敗:-1并設置errno
          • 特點
            • 1.子進程幾乎拷貝了父進程的所有內容,包括代碼、數據,緩沖區,系統數據段中的值,棧中的數據,父進程打開的文件,但是PID,PPID不同
            • 2.fork之前的代碼會被復制但是不會被重新執行,fork之后的代碼會被復制,并且父子進程分別執行一遍。
            • 3.父子進程的空間相互獨立,互不影響,當在相應的進程中改變全局變量,靜態變量,都互不影響
            • 4.fork之前打開的文件,fork之后拿到的是同一個文件描述符,操作的是同一個文件指針
            • 5.若父進程先結束,子進程成為孤兒進程,被init進程所收養,會變成后臺進程。
            • 6.若子進程先結束,父進程不結束,父進程沒有及時回收,子進程就會變成僵尸進程(避免僵尸進程的產生)
      • 8.回收進程
        • pid_t wait(int *status);
        • 功能:回收子進程資源(阻塞)
        • 參數:status:子進程退出狀態,不接受子進程狀態設為NULL
        • 返回值:成功:回收的子進程的進程號 ? ? ? 失敗:-1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
        • pid_t waitpid(pid_t pid, int *status, int options);
        • 功能:回收子進程資源
        • 參數:
        • pid:>0 指定子進程進程號 ? ? ? ?=-1 任意子進程 ? ? ? ?=0 等待其組ID等于調用進程的組ID的任一子進程 ? ? ? ? ?<-1 等待其組ID等于pid的絕對值的任一子進程 ? ?
        • status:子進程退出狀態 ? ?
        • options:0:阻塞 ? ? ? ? ?WNOHANG:非阻塞
        • 返回值:正常:結束的子進程的進程號 ? ? ?當使用選項WNOHANG且沒有子進程結束時:0 ? ? ? 出錯:-1
      • 9.結束進程
        • void exit(int status);
        • 功能:結束進程,刷新緩存
        • 參數:退出的狀態 不返回。
      • 10.獲取進程號
        • pid_t getpid(void);
        • 功能:獲取當前進程的進程號
        • pid_t getppid(void);
        • 功能:獲取當前進程的父進程號
    • 六、進程間通信
      • 1.為什么要進行進程間通信
        • 數據傳輸、資源共享、事件通知、進程控制
      • 2.進程間通信方式(7)
        • (1).早期進程間通信 無名管道(pipe)、有名管道(fifo)、信號(sem)
        • (2).system V IPC通信 共享內存(share memory)、消息隊列(message queue)、信號燈集(semaphore)
        • (3).BSD: 套接字(socket)
      • 3.無名管道
        • 3.1原理圖
          • 通信原理:一個進程的輸出可以當作另一進程的輸入
        • 3.2特點
          • (1).只能用于具有親緣關系的進程間通信
          • (2).半雙工通信模式,具有固定的讀端和寫端 {單工:只能單方向通信, 廣播 半雙工:可以雙向通信,但是同一時間不可以 對講機 全雙工:可以雙向同時通信 打電話}
          • (3).無名管道可以被看做一個特殊的文件,對于他的讀寫可以使用文件IO函數 (注意:不是文件,他只是存在于內核空間的一部分,無實際文件)
          • (4).管道基于文件描述符進行通信。當一個管道建立的時候,它會自動創建兩個文件描述符,一個用于讀fd[0],一個用于寫fd[1]。
        • 3.3函數
          • int pipe(int fd[2])
          • 功能:創建無名管道
          • 參數:文件描述符 fd[0]:讀端 fd[1]:寫端
          • 返回值:成功 0 ? ? ? 失敗 -1
      • 4.有名管道(FIFO)
        • 4.1特點
          • (1).可以使互不相干的兩個進程通信
          • (2).有名管道可以通過路徑名來指出,并在文件系統中可見,但是內容存儲在內存中
          • (3).進程通過文件IO操作有名管道
          • (4).有名管道遵循先進先出的原則,不支持lseek()操作
          • (5).半雙工通信
        • 4.2函數
          • int mkfifo(const char *filename,mode_t mode);
          • 功能:創建有名管道
          • 參數:filename:有名管道文件名 ? ? ? ?mode:權限
          • 返回值:成功:0 ? ? ? ?失敗:-1,并設置errno號
    • 七、信號
      • 1.例子
        • kill -l:查看系統中信號
        • kill -num pid:給pid進程發送pid信號
      • 2.概念
        • (1).信號是在軟件層次上對中斷機制的一種模擬,是一種異步通信方式。 (2).信號可以直接進行用戶空間進程和內核進程之間的交互,內核進程也可以利用它來通知用戶空間進程發生了哪些系統事件。 (3).如果該進程當前并未處于執行態,則該信號就由內核保存起來,直到該進程恢復執行再傳遞給它;如果一個信號被進程設置為阻塞,則該信號的傳遞被延遲,直到其阻塞被取消時才被傳遞給進程。
      • 3.信號響應方式
        • (1.)忽略信號:對信號不做任何處理,但是有兩個信號不能做忽略處理:SIGKILL和SIGSTOP
        • (2).捕捉信號:定義信號處理函數,當信號發生的時候,執行相應的處理函數,但是有兩個信號不能做捕捉處理:SIGKILL和SIGSTOP
        • (3).執行缺省操作:linux對每種信號都規定了默認信號。
      • 4.信號的種類
        • 2)SIGINT:結束進程,對應快捷方式ctrl+c
        • 3)SIGQUIT:退出信號,對應快捷方式ctrl+\
        • 9)SIGKILL:結束進程,不能被忽略不能被捕捉
        • 14)SIGALRM:鬧鐘信號,alarm函數設置定時,當到設定的時間時,內核會向進程發送此信號結束進程。
        • 15)SIGTERM:結束終端進程,kill 使用時不加數字默認是此信號
        • 17)SIGCHLD:子進程狀態改變時給父進程發的信號
        • 19)SIGSTOP:暫停進程,不能被忽略不能被捕捉
        • 20)SIGTSTP:暫停信號,對應快捷方式ctrl+z
        • 信號的種類
        • 在Linux中,信號被分為不可靠信號和可靠信號,一共64種,可以通過kill -l命令來查看
        • ●不可靠信號:也稱為非實時信號,不支持排隊,信號可能會丟失,比如發送多次相同的信號,進程只能收到一次,信號值取值區間為1~31
        • ●可靠信號:也稱為實時信號,支持排隊,信號不會丟失,發多少次,就可以收到多少次,信號值取值區間為32~64 信號產生的方式有如下幾種:
        • ● 對于前臺進程,用戶可以輸入特殊終端字符來發送,比如輸入Ctrl+C
        • ● 系統異常,比如浮點異常和非法內存段訪問
        • ● 系統狀態變化,比如alarm定時器到期時將引起SIGALRM信號
        • ● 在終端運行kill命令或在程序中調用kill函數
      • 5.函數接口
        • 5.1發送信號
          • int kill(pid_t pid, int sig);
          • 功能:信號發送
          • 參數:pid:指定進程 ? ? ? ? ? sig:要發送的信號
          • 返回值:成功 0?? ? ? ? ? ? ?失敗 -1? ? ?
          • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
          • ?int raise(int sig);
          • 功能:進程向自己發送信號
          • 參數:sig:信號
          • 返回值:成功 0?? ? ? ? ? ? ?
          • 失敗 -1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
          • ??int pause(void);
          • 功能:用于將調用進程掛起,直到收到信號為止。?
        • 5.2定時器
          • unsigned int alarm(unsigned int seconds)
          • 功能:在進程中設置一個定時器
          • 參數:seconds:定時時間,單位為秒
          • 返回值:如果調用此alarm()前,進程中已經設置了鬧鐘時間,則 返回上一個鬧鐘時間的剩余時間,否則返回0。
          • 注意:一個進程只能有一個鬧鐘時間。如果在調用alarm時 已設置過鬧鐘時間,則之前的鬧鐘時間被新值所代替
        • 5.3信號處理
          • #include <signal.h>
          • typedef void (*sighandler_t)(int);
          • sighandler_t signal(int signum, sighandler_t handler);
          • 功能:信號處理函數
          • 參數:
          • signum:要處理的信號 ? ? ? ? ?
          • handler:信號處理方式 ? ? ? ? ? ? ?
          • SIG_IGN:忽略信號 ? ? ? ? ? ? ?
          • SIG_DFL:執行默認操作 ? ? ? ? ? ? ?
          • handler:捕捉信號 void handler(int sig){} //函數名可以自定義
          • 返回值:成功:設置之前的信號處理方式 ? ? ? ? ? ? ?失敗:-1
    • 八、共享內存
      • 1.特點
        • (1).共享內存是一種最為高效的進程間通信方式,進程可以直接讀寫內存,不需要進行任何數據的拷貝
        • (2).為了在多個進程間進行數據的交互,內核專門留了一塊內存區,可以由需要訪問的進程將其映射到自己的地址空間
        • (3).由于多個進程共享一段內存,因此也需要依靠某種同步機制,如互斥鎖和信號量等
      • 2.編程步驟
        • (1).創建或者打開共享內存shmget
        • (2).映射共享內存到自己的用戶空間shmat
        • (3).使用共享內存
        • (4).撤銷映射
        • (5).刪除共享內存
      • 3.函數接口
        • int shmget(key_t key, size_t size, int shmflg);
        • 功能:創建或打開共享內存
        • 參數: ? ? key 鍵值 ? ? size 共享內存的大小 ? ? shmflg IPC_CREAT|IPC_EXCL(判錯)|0666
        • 返回值:成功 shmid ? ? ? ? ? ? ?出錯 -1
        • void *shmat(int shmid,const void *shmaddr,int shmflg);
        • 功能:映射共享內存,即把指定的共享內存映射到進程的地址空間用于訪問
        • 參數: ? ?
        • shmid 共享內存的id號 ? ?
        • shmaddr 一般為NULL,表示由系統自動完成映射,如果不為NULL,那么由用戶指定 ? ?
        • shmflg:SHM_RDONLY就是對該共享內存只進行讀操作? ,0 可讀可寫
        • 返回值:成功:完成映射后的地址, ? ? ? 失敗:-1的地址
        • 用法:if((p = (char *)shmat(shmid,NULL,0)) == (char *)-1)? ? ? ? ? ? ? ? ?
        • ?int shmdt(const void *shmaddr);
        • 功能:取消映射
        • 參數:要取消的地址
        • 返回值:成功0 ? ? ? 失敗的-1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
        • int shmctl(int shmid,int cmd,struct shmid_ds *buf);
        • 功能:(刪除共享內存),對共享內存進行各種操作
        • 參數: ? ?
        • shmid 共享內存的id號 ? ?
        • cmd IPC_STAT 獲得shmid屬性信息,存放在第三參數 ? ? ? ? ? ?
        • IPC_SET 設置shmid屬性信息,要設置的屬性放在第三參數 ? ? ? ? ? ?
        • IPC_RMID:刪除共享內存,此時第三個參數為NULL即可
        • 返回:成功0 ? ? ?失敗-1
        • 用法:shmctl(shmid,IPC_RMID,NULL);
      • 4.命令
        • ipcs -m:查看系統中共享內存
        • ipcrm -m shmid :刪除共享內存

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

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

相關文章

k8s 1.24.17版本部署(使用Flannel插件)

1.k8s集群環境準備 推薦閱讀: https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ 1.1 環境準備 環境準備:硬件配置: 2core 4GB磁盤: 50GB操作系統: Ubuntu 22.04.04 LTSIP和主機名:10.0.0.231 master23110.0.0.232 worker23210.0…

網絡編程—TCP/IP模型(UDP協議與自定義協議)

上篇文章&#xff1a; 網絡編程—Socket套接字&#xff08;TCP&#xff09;https://blog.csdn.net/sniper_fandc/article/details/146923783?fromshareblogdetail&sharetypeblogdetail&sharerId146923783&sharereferPC&sharesourcesniper_fandc&sharefro…

GNSS有源天線和無源天線

區別 需要外部供電的就是有源天線&#xff0c;不需要外部供電的是無源天線。 無源天線 一般就是一個陶瓷片、金屬片等&#xff0c;結構簡單&#xff0c;成本低廉&#xff0c;占用空間及體積小&#xff0c;適合于強調緊湊型空間的導航類產品。 不需要供電&#xff0c;跟設備直…

網絡編程—TCP/IP模型(IP協議)

上篇文章&#xff1a; 網絡編程—TCP/IP模型&#xff08;TCP協議&#xff09;https://blog.csdn.net/sniper_fandc/article/details/147011479?fromshareblogdetail&sharetypeblogdetail&sharerId147011479&sharereferPC&sharesourcesniper_fandc&sharef…

基于金字塔視覺變換的類引導網絡高分辨率遙感圖像高效語義分割

Class-Guidance Network Based on the Pyramid Vision Transformer for Ef?cient Semantic Segmentation of High-Resolution Remote Sensing Images 摘要 多分類語義分割中類之間的小差異和類內的大變化是全卷積神經網絡的“編碼器-解碼器”結構沒有完全解決的問題&#…

基于人工智能的高中教育評價體系重構研究

基于人工智能的高中教育評價體系重構研究 一、引言 1.1 研究背景 在科技飛速發展的當下&#xff0c;人工智能技術已廣泛滲透至各個領域&#xff0c;教育領域亦不例外。人工智能憑借其強大的數據處理能力、智能分析能力和個性化服務能力&#xff0c;為教育評價體系的創新與發…

DeepSeek在互聯網技術中的革命性應用:從算法優化到系統架構

引言:AI技術重塑互聯網格局 在當今快速發展的互聯網時代,人工智能技術正以前所未有的速度改變著我們的數字生活。DeepSeek作為前沿的AI技術代表,正在多個互聯網技術領域展現出強大的應用潛力。本文將深入探討DeepSeek在搜索引擎優化、推薦系統、自然語言處理以及分布式系統…

數字游戲(繼Day 10)

主體: #include<stdio.h> #include<time.h> #include<stdlib.h>#include"mygetch.h"#define MAX 51 //定義測試字母的最大長度void help() {printf("\n****************************************");printf("\n*輸入過程中無法退出…

談談模板方法模式,模板方法模式的應用場景是什么?

一、模式核心理解 模板方法模式是一種??行為設計模式??&#xff0c;通過定義算法骨架并允許子類重寫特定步驟來實現代碼復用。 如同建筑圖紙規定房屋結構&#xff0c;具體裝修由業主決定&#xff0c;該模式適用于??固定流程中需要靈活擴展??的場景。 // 基礎請求處理…

2024 Jiangsu Collegiate Programming Contest H

記錄一下為數不多的網絡流 #pragma GCC optimize(3,"Ofast","inline") #include<bits/stdc.h> #include <execution> using namespace std; using i64 long long; using i128 __int128;template <typename T>struct MCFgraph{struct …

Hadoop序列化與反序列化

一、Hadoop序列化概述 &#xff08;一&#xff09;什么是序列化和反序列化 序列化&#xff1a;序列化是將對象&#xff08;如Java中的類實例&#xff09;轉換為字節序列的過程。在Hadoop中&#xff0c;數據在分布式系統中傳輸或者存儲到磁盤時&#xff0c;需要將數據對象序列…

FreeRTOS臨界區

在FreeRTOS中&#xff0c;臨界區通過關閉可管理的中斷來保護共享資源&#xff0c;具體關閉的中斷層級由configMAX_SYSCALL_INTERRUPT_PRIORITY宏定義決定。以下是關鍵點解析&#xff1a; 中斷優先級分類&#xff1a; 高優先級中斷&#xff1a;數值低于configMAX_SYSCALL_INTERR…

cdw2: TypeScript

一、javascript的問題 二、初識typescript https://mp.weixin.qq.com/s/wnL1l-ERjTDykWM76l4Ajw 三、類型 二進制&#xff1a;ob開頭&#xff0c;八進制&#xff1a;0o開頭&#xff0c;十六進制&#xff1a;0x開頭 開發中不這樣寫 這樣寫 匿名函數的參數最好不要…

Qt中的元對象系統

Qt的元對象系統(Meta-Object System)提供了對象間通信的信號和槽機制、運行時類型信息和動態屬性系統。 元對象系統基于以下三個方面&#xff1a; (1).QObject類&#xff1a;為可以利用元對象系統的對象提供了基類。 (2).Q_OBJECT宏&#xff1a;用于啟用元對象功能&#xff0c;…

深入理解重排(Reflow)與重繪(Repaint),寫出高性能 CSS 動畫

在前端開發中&#xff0c;CSS 動畫是提升用戶體驗的重要手段&#xff0c;但很多開發者在使用動畫時并不了解瀏覽器背后的渲染機制&#xff0c;導致動畫卡頓甚至影響整體性能。本文將帶你深入理解 CSS 中的兩大核心概念 —— 重排&#xff08;Reflow&#xff09; 與 重繪&#x…

<貪心算法>

前言&#xff1a;在主包還沒有接觸算法的時候&#xff0c;就常聽人提起“貪心”&#xff0c;當時是layman&#xff0c;根本不知道說的是什么&#xff0c;以為很難呢&#xff0c;但去了解一下&#xff0c;發現也不過如此嘛&#xff08;bushi)&#xff0c;還以為是什么高級東西呢…

大模型快速 ASGI 服務器uvicorn

基礎概念類 1. 什么是 Uvicorn&#xff0c;它的作用是什么&#xff1f; 答案&#xff1a;Uvicorn 是一個基于 Python 的快速 ASGI&#xff08;異步服務器網關接口&#xff09;服務器。它的主要作用是作為 Web 應用程序的服務器&#xff0c;負責接收客戶端的請求&#xff0c;并…

2025高頻面試算法總結篇【二叉樹】

文章目錄 直接刷題鏈接直達非遞歸實現求二叉樹的深度非遞歸從左至右打印一顆二叉樹中的所有路徑判斷平衡二叉樹二叉搜索樹中第K小的元素二叉樹的完全性檢驗根據前&中序遍歷結果重建二叉樹二叉樹的最近公共祖先二叉樹的直徑二叉樹的遍歷 直接刷題鏈接直達 非遞歸實現求二叉…

redis 和 MongoDB都可以存儲鍵值對,并且值可以是復雜json,用完整例子分別展示說明兩者在存儲json鍵值對上的使用對比

Redis 存儲 JSON 鍵值對示例 存儲操作&#xff1a; // 存儲用戶信息&#xff08;鍵&#xff1a;user:1001&#xff0c;值&#xff1a;JSON對象&#xff09; SET user:1001 {"name":"Alice", "age":30, "address":"New York&quo…

介紹幾種創意登錄頁(含完整源碼)

今天為大家收集了幾種不同風格的登錄頁&#xff0c;搭配動態漸變背景&#xff0c;效果絕對驚艷&#xff01; CSS3實現動態漸變玻璃擬態登錄頁 一、開篇語 純CSS實現當下最火的玻璃擬態(Morphism)風格登錄頁&#xff0c;搭配動態漸變背景&#xff0c;效果絕對驚艷&#xff01; …