【Linux】序列化與反序列化、會話與進程組、守護進程

一.序列化和反序列化

協議其實就是結構化的數據。但是再網絡通信中,我們不直接發送結構化的數據給對方。我們一般會將結構化的數據序列化成字符串/字節流,然后通過網絡在發送出去。而接收方收到之后,要對收到的字符串/流式數據進行反序列化,即還原成結構化的樣子。

那么我們可以直接發送二進制對象么,這個結構化數據雙方都能認識啊?

可以,但不建議。

可以是因為在操作系統內部,協議都是直接傳遞的結構體,因為所有的操作系統都是C語言寫的。不會存在差異。

不建議是因為通信雙方可能是不同的語言實現的,這導致它們對結構體的對齊規則可能有差異。導致接受的數據可能不完整。

二.使用jsoncpp庫實現序列化和反序列化

1.序列化

#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>int main()
{Json::Value root;root["name"] = "zhangsan";root["age"] = 18;root["sex"] = "man";// 1. 使用root.toStyledString()序列化std::string s1 = root.toStyledString();std::cout << s1 << std::endl;// 2. 使用StyledWriter對象的write方法進行序列化Json::StyledWriter writer;std::string s2 = writer.write(root);std::cout << s2 << std::endl;// 3. 使用FastWriter對象的write方法進行序列化Json::FastWriter wr;std::string s3 = wr.write(root);std::cout << s3 << std::endl;// 4. 使用StreamWriterBuidler 對象new一個witer對象// 通過new出來的對象,將root數據,寫入到一個字符串流中Json::StreamWriterBuilder swb;std::unique_ptr<Json::StreamWriter> wri(swb.newStreamWriter());std::stringstream ss;wri->write(root, &ss);std::cout << ss.str() << std::endl;return 0;
}

2.反序列化?

#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>int main()
{Json::Value root;root["name"] = "zhangsan";root["age"] = 18;root["sex"] = "man";// 1. 使用root.toStyledString()序列化std::string s1 = root.toStyledString();std::cout << s1 << std::endl;// 2.反序列化Json::Reader reader;reader.parse(s1, root);std::string name = root["name"].asString();int age = root["age"].asInt();std::string sex = root["sex"].asString();std::cout << "name->" << name << std::endl;std::cout << "age->" << age << std::endl;std::cout << "sex->" << sex << std::endl;
}

三.tcp支持全雙工?

我們進行tcp socket編程時,是直接使用read、write接口使用sockf進行讀寫的。而且我們讀寫都使用的是同一個文件描述符。這也就說明了tcp是支持全雙工的。這是因為tcp內部有兩個緩沖區---接收緩沖區和發送緩沖區。

而read和write并不是直接將數據寫入到網絡中的,而是先將數據發送到發送緩沖區中,最后由tcp協議決定什么時候將緩沖區的數據發送到網絡中。write也不是直接從網絡中讀,而是從接收緩沖區中讀。

在發送數據的時候,tcp(傳輸控制協議)自主決定,什么時候發,發多少,出錯了怎么辦。

主機間通信的本質:把發送方的發送緩沖區內部的數據,拷貝到對端的接收緩沖區。?

四.會話

1.進程組?

進程是以進程組的方式來完成作業的。進程組是一個或多個進程的集合。

我們啟動了一個sleep 1000 | sleep 2000 | sleep 3000 & 的后臺程序。而這三個進程就組成了一個進程組。

?進程組id就是該進程組的組長id,也就是組長id的pid。

2.會話

而SID就是會話。當我們登錄的時候,打開終端,ssh會為我們打開0,1,2文件描述符,然后進行程序替換,讓bash運行。一登錄終端,就會創建一個會話,此時會話中只有一個進程組,該進程組中只有一個bash進程。

一個會話內部會存在多個進程組。

?五.守護進程

我們目前運行的程序都是直接在當前會話中啟動的。并且都是只有一個進程的進程組。而該進程是受用戶終端的登錄狀態影響的。當我們退出登錄,就會銷毀會話,會話中的進程就有可能被影響。

對于服務器來說,作為一個常駐內存的進程,不應該受用戶的登錄和退出狀態所影響。

為了避免登錄和注銷的影響,我們需要將進程進行守護進程化。

守護進程即該進程擁有一個獨立的會話,并且再后臺運行。

?使用setsid來使進程,守護進程化。

NAMEsetsid - creates a session and sets the process group IDSYNOPSIS#include <sys/types.h>#include <unistd.h>pid_t setsid(void);

setsid要求調用該函數的進程不能是進程組的組長。(進程組的組長退出了,進程組并不會銷毀,直到該進程組中所有的進程都退出了,進程組才消失)。

所以,我們可以采取fork子進程,并讓父進程直接退出,讓子進程執行setsid。

當然,我們也可以使用庫里面的方法,實現守護進程化。

nochdir:是否將當前的工作目錄轉換為根目錄

noclose:是否將0,1,0重定向到/dev/null文件,從該文件讀只會讀到null,寫入該文件的內容都會被丟棄

NAMEdaemon - run in the backgroundSYNOPSIS#include <unistd.h>int daemon(int nochdir, int noclose);

下面是實現守護進程化的具體操作。??

#pragma once #include <iostream>
#include <string>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>const std::string cwd = "/";
const std::string dev = "/dev/null";// 讓網絡服務器守護進程化
// 讓啟動的進程,獨立成為一個進程組,并且占有獨立的會話
// 守護進程化要求該進程不能是進程組的組長
void Daemon(int nochdir, int noclose)
{// 1. 守護進程忽略IO,以及子進程退出等相關信號signal(SIGPIPE, SIG_IGN);signal(SIGCHLD, SIG_IGN);// 2.必須得是一個進程組的組員,不能是組長if(fork() > 0) exit(0);// 下面就是子進程,也就是組員進程// 2.5 守護進程話setsid();// 3.守護進程執行時需要將其當前的工作目錄改為/根目錄if(nochdir == 0) chdir(cwd.c_str());// 4.守護進程本質上是一個孤兒進程,后臺進程// 要避免其使用0,1,2與終端交互// 所以,將0,1,2重定向到/dev/null文件,該文件會將寫入的內容丟棄,從該文件讀,會讀到nullptrif(noclose == 0){int fd = open(dev.c_str(), O_RDWR); // 以讀寫方式打開// 重定向// int dup2(int oldfd, int newfd); // dup2會使用oldfd,覆蓋newfddup2(fd, 0);dup2(fd, 1);dup2(fd, 2);close(fd);}
}

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

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

相關文章

提權腳本Powerup命令備忘單

1. 獲取與加載 從 GitHub 下載&#xff1a;(New-Object Net.WebClient).DownloadFile("https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Privesc/PowerUp.ps1", "C:\Temp\PowerUp.ps1")本地加載&#xff1a;Import-Module .\Power…

2025年Ai寫PPT工具推薦,這5款Ai工具可以一鍵生成專業PPT

上個月給客戶做產品宣講時&#xff0c;我對著空白 PPT 頁面熬到凌晨一點&#xff0c;光是調整文字排版就改了十幾版&#xff0c;最后還是被吐槽 "內容零散沒重點"。后來同事分享了幾款 ai 寫 PPT 工具&#xff0c;試完發現簡直打開了新世界的大門 —— 不用手動寫大綱…

部署docker上的redis,idea一直顯示Failed to connect to any host resolved for DNS name

參考了https://blog.csdn.net/m0_74216612/article/details/144145127 這篇文章&#xff0c;關閉了centos的防火墻&#xff0c;也修改了redis.conf文件&#xff0c;還是一直顯示Failed to connect to any host resolved for DNS name。最終發現是騰訊云服務器那一層防火墻沒…

QML元素 - OpacityMask

QML 的 OpacityMask 用于通過遮罩元素的 透明度&#xff08;Alpha 通道&#xff09; 裁剪源元素的可見區域&#xff0c;適用于創建不規則形狀的 UI 元素&#xff08;如圓形頭像、波浪形進度條&#xff09;或復雜視覺效果。以下是詳細使用技巧和常見場景示例&#xff1a; 1. 基本…

麒麟桌面系統文件保險箱快捷訪問指南:讓重要文件夾一鍵直達桌面!

往期文章鏈接&#xff1a;統信操作系統自定義快捷鍵配置音量調節功能指南 Hello&#xff0c;大家好啊&#xff0c;今天給大家帶來一篇麒麟桌面操作系統上配置文件保險箱內文件夾桌面快捷方式的文章&#xff0c;歡迎大家分享點贊&#xff0c;點個在看和關注吧&#xff01;在日常…

LLM筆記(三)位置編碼(1)

位置編碼理論與應用 1. 位置編碼如何解決置換不變性及其數學表現 在Transformer模型中&#xff0c;自注意力機制&#xff08;Self-Attention&#xff09;具有置換不變性&#xff08;permutation invariance&#xff09;&#xff0c;這意味著對輸入序列的詞元&#xff08;toke…

在人臉識別項目中ffmpeg有什么作用

在人臉識別項目中&#xff0c;FFmpeg 主要用于處理視頻文件或流媒體數據。盡管 FFmpeg 本身并不是直接用于人臉識別的工具&#xff0c;但它通過其強大的多媒體處理能力&#xff0c;在很多方面間接支持了人臉識別任務的執行。以下是 FFmpeg 在人臉識別項目中的幾個主要作用&…

問題 | 國內外軟件定義衛星最新進展研究

軟件定義衛星 **一、國內進展****二、國際進展****三、未來發展方向****總結** 軟件定義衛星&#xff08;Software-Defined Satellite, SDS&#xff09;作為航天領域的重要技術革新方向&#xff0c;近年來在全球范圍內發展迅速。其核心是通過開放式架構和動態軟件配置實現衛星功…

【專利信息服務平臺-注冊/登錄安全分析報告】

前言 由于網站注冊入口容易被黑客攻擊&#xff0c;存在如下安全問題&#xff1a; 暴力破解密碼&#xff0c;造成用戶信息泄露短信盜刷的安全問題&#xff0c;影響業務及導致用戶投訴帶來經濟損失&#xff0c;尤其是后付費客戶&#xff0c;風險巨大&#xff0c;造成虧損無底洞…

【Linux專欄】Linux進程間關系和守護進程

文章目錄 1、進程間關系1.1 進程組1.2 組長進程 2、會話&#xff1f;2.1 查看會話2.2 創建會話 3、控制終端4、作業控制4.1 前臺/后臺進程 5、守護進程5.1 如何創建守護進程&#xff1f;5.2 殺掉守護進程 1、進程間關系 主要描述兩個名稱概念&#xff1a;即進程組和組長進程。…

電商物流管理優化:從網絡重構到成本管控的全鏈路解析

大家好&#xff0c;我是沛哥兒。作為電商行業&#xff0c;我始終認為物流是電商體驗的“最后一公里”&#xff0c;更是成本控制的核心戰場。隨著行業競爭加劇&#xff0c;如何通過物流網絡優化實現降本增效&#xff0c;已成為電商企業的必修課。本文將從物流網絡的各個環節切入…

ubuntu 更新華為源

1. 備份配置文件 sudo cp -a /etc/apt/sources.list /etc/apt/sources.list.bak 2. 修改source.list 文件&#xff0c;將http://archive.ubuntu.com和http://security.ubuntu.com替換成http://repo.huaweicloud.com&#xff0c;可以參考如下命令&#xff1a; # 第一條指令 s…

CS016-4-unity ecs

【37】將系統轉換為任務 Converting System to Job 【Unity6】使用DOTS制作RTS游戲|17小時完整版|CodeMonkey|【37】將系統轉換為任務 Converting System to Job_嗶哩嗶哩_bilibili a. 將普通的方法&#xff0c;轉化成job。第一個是寫一個partial struct xxx&#xff1b;第二…

如何使用 React Hooks 替代類組件的生命周期方法?

文章目錄 1. 引言2. useEffect 概述3. 模擬類組件的生命周期方法3.1 模擬 componentDidMount3.2 模擬 componentDidUpdate3.3 模擬 componentWillUnmount 4. 多個 useEffect 的使用5. 注意事項6. 總結 1. 引言 在 React 16.8 版本之前&#xff0c;開發者主要通過類組件&#x…

盒帶自編教材《軟件工程》目錄

目錄 前言 第1章 軟件工程概述 1.1 軟件概述 1.1.1 軟件的定義 1.1.2 軟件的特點 1.1.3 軟件的分類 1.1.4 軟件的發展 1.2 軟件危機 1.2.1 什么是軟件危機 1.2.2 產生的原因及解決途徑 1.3 軟件工程 1.3.1 軟件工程定義 1.3.2 軟件工程的研究內容 1.3.3 軟件工程的目標和原則…

CAN通信協議傳輸數據,為什么喜歡低位在前高位在后?而RS485則更傾向高位在前低位在后?

CAN 通信協議通常采用低位在前&#xff08;小端字節序&#xff09;&#xff0c;而 RS - 485 本身沒有固定要求高位在前或低位在后&#xff0c;其數據傳輸順序更多取決于具體應用和上層協議。 CAN 通信協議低位在前的原因 硬件設計與實現角度 邏輯電路處理便捷&#xff1a;數…

NGINX 安全性:持續進化的防護能力,為您的應用保駕護航

在數字時代,網絡安全的重要性不言而喻。任何暴露在互聯網上的應用都可能成為攻擊者的目標。作為互聯網基礎設施的關鍵組成部分,NGINX 不僅是高性能的 Web 服務器和反向代理,更在應用安全防護方面扮演著至關重要的角色。它就像您數字資產的“第一道防線”和“智能門禁”,憑借…

makefile細節說明

在 Makefile中&#xff0c;依賴關系的左右兩部分有特定的名稱&#xff1a; ??左邊部分&#xff08;冒號左側&#xff09;?? 稱為 ??目標&#xff08;Target&#xff09;?? ??右邊部分&#xff08;冒號右側&#xff09;?? 稱為 ??依賴項&#xff08;Prerequisite…

Zephyr OS Nordic芯片的Flash 操作

目錄 概述 1. 軟硬件環境 1.1 軟件開發環境 1.2 硬件環境 2 Flash操作庫函數 2.1 nRF52832的Flash 2.2 Nordic 特有的 Flash 操作 2.2.1 nrfx_nvmc_bytes_write 函數 2.2.2 nrfx_nvmc_page_erase函數 2.2.3 nrfx_nvmc_write_done_check 函數 3 操作Flash的接口函數…

03、基礎入門-SpringBoot的大時代背景

03、基礎入門-SpringBoot的大時代背景 # Spring Boot的大時代背景 Spring Boot的出現和發展&#xff0c;與以下時代背景密切相關&#xff1a; ## 1. 微服務架構的興起 ### 背景 隨著互聯網應用的復雜度增加&#xff0c;傳統的單體架構在擴展性、維護性和團隊協作方面遇到瓶…