守護進程編程、GDB調試以及外網連接樹莓派

目錄

    • 一、什么是守護進程以及如何創建守護進程
      • 1. 什么是守護進程?
      • 2. 如何創建守護進程?
    • 二、什么是GDB調試以及如何用GDB命令調試C程序
      • 1. 什么是GDB?
      • 2. 如何用GDB命令調試C程序?
    • 三、外網訪問樹莓派

一、什么是守護進程以及如何創建守護進程

1. 什么是守護進程?

守護進程(Daemon Process)是一種特殊的后臺進程,它獨立于控制終端,并且周期性地執行某種任務或者等待處理特定事件。守護進程通常在系統啟動時開始運行,直到系統關閉才結束,它們為系統提供各種服務,例如 Web 服務器、郵件服務器、日志記錄等

2. 如何創建守護進程?

編程實現守護進程的主要過程:

  1. 創建子進程并終止父進程:通過 fork() 創建子進程,父進程退出,子進程繼續運行。
  2. 創建新的會話:調用 setsid() 創建新的會話,使進程成為會話領導者,從而脫離原來的終端。
  3. 改變工作目錄:通常將工作目錄更改為根目錄 /,避免因原工作目錄被卸載而導致的進程終止。
  4. 重設文件權限掩碼:調用 umask(0) 設置適當的文件權限掩碼,確保守護進程創建的文件具有正確的權限。
  5. 關閉文件描述符:關閉所有不需要的文件描述符,避免資源泄漏。
  6. 重定向標準輸入、輸出和錯誤:將標準輸入、輸出和錯誤重定向到 /dev/null 或日志文件。
  7. 進入主循環:守護進程進入主循環,周期性地執行任務。

創建一個守護進程的三種方法:
由于阿里云服務器暫時無法登錄,所以下面只展示在樹莓派上的操作。

  1. 使用 nohup 命令
    在阿里云服務器或樹莓派上,可以使用以下命令創建守護進程:
nohup ./your_program > output.log 2>&1 &

在這里插入圖片描述

nohup 使程序忽略 SIGHUP 信號,即使終端關閉,程序也會繼續運行。
>” 將標準輸出重定向到 output.log 文件。
2>&1 將標準錯誤也重定向到標準輸出。
& 將程序放到后臺運行。

  1. 使用 fork() 函數
    以下是一個使用 fork() 函數創建守護進程的 C 程序示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>void daemonize() {pid_t pid = fork();if (pid < 0) {perror("fork");exit(EXIT_FAILURE);}if (pid > 0) {exit(EXIT_SUCCESS); // 父進程退出}// 創建新會話if (setsid() < 0) {perror("setsid");exit(EXIT_FAILURE);}// 改變工作目錄if (chdir("/") < 0) {perror("chdir");exit(EXIT_FAILURE);}// 設置文件權限掩碼umask(0);// 再次創建子進程并退出父進程pid = fork();if (pid < 0) {perror("fork");exit(EXIT_FAILURE);}if (pid > 0) {exit(EXIT_SUCCESS); // 父進程退出}// 關閉文件描述符close(STDIN_FILENO);close(STDOUT_FILENO);close(STDERR_FILENO);
}int main() {daemonize();while (1) {sleep(1); // 守護進程的主循環}return 0;
}

在阿里云服務器或樹莓派上,編譯并運行該程序:

gcc -o daemon_fork daemon_fork.c
./daemon_fork

在這里插入圖片描述

  1. 使用 daemon() 函數
    以下是一個使用 daemon() 函數創建守護進程的 C 程序示例:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>int main() {if (daemon(0, 0) == -1) {perror("daemon");return EXIT_FAILURE;}while (1) {sleep(1); // 守護進程的主循環}return 0;
}

在阿里云服務器或樹莓派上,編譯并運行該程序:

gcc -o daemon_daemon daemon_daemon.c
./daemon_daemon

在這里插入圖片描述

二、什么是GDB調試以及如何用GDB命令調試C程序

1. 什么是GDB?

GDB 全稱“GNU symbolic debugger”,從名稱上不難看出,它誕生于 GNU 計劃(同時誕生的還有 GCC、Emacs 等),是 Linux 下常用的程序調試器。發展至今,GDB 已經迭代了諸多個版本,當下的 GDB 支持調試多種編程語言編寫的程序,包括 C、C++、Go、Objective-C、OpenCL、Ada 等。實際場景中,GDB 更常用來調試 C 和 C++ 程序。
總的來說,借助 GDB 調試器可以實現以下幾個功能:
程序啟動時,可以按照我們自定義的要求運行程序,例如設置參數和環境變量;
可使被調試程序在指定代碼處暫停運行,并查看當前程序的運行狀態(例如當前變量的值,函數的執行結果等),即支持斷點調試;
程序執行過程中,可以改變某個變量的值,還可以改變代碼的執行順序,從而嘗試修改程序中出現的邏輯錯誤。

2. 如何用GDB命令調試C程序?

1. 安裝 GDB
在阿里云服務器或樹莓派上,可以通過以下命令安裝 GDB:

sudo apt-get update
sudo apt-get install gdb

安裝完成后,可以通過運行 gdb --version 來驗證是否安裝成功
在這里插入圖片描述

2. 編寫和編譯 C 程序
設計一個簡單的 C 程序 example.c

#include <stdio.h>
int main() {int a = 5;int b = 10;int c = a + b;printf("The result is: %d\n", c);return 0;
}

為了能夠使用 GDB 進行調試,需要在編譯時加入 -g 選項,這樣編譯器會在生成的可執行文件中包含調試信息:

gcc -g -o example example.c

這將生成一個名為 example 的可執行文件

3. 使用 GDB 進行調試
有了帶調試信息的可執行文件后,就可以使用 GDB 進行調試了。
啟動 GDB
在終端中運行以下命令啟動 GDB,并加載可執行文件:

gdb example

設置斷點
在調試過程中,設置斷點是非常重要的步驟。斷點可以讓程序在執行到某一行時暫停,方便查看和修改變量值。在 GDB 中,可以使用 break 命令設置斷點,例如:

break main

這將設置一個斷點在 main 函數的入口處。也可以在特定的行號或函數處設置斷點,例如:

break example.c:10

運行程序
設置好斷點后,可以使用 run 命令運行程序:

run

程序會在遇到斷點時暫停,此時可以查看和修改變量的值
查看和修改變量
在程序暫停時,可以使用 print 命令查看變量的值,例如:

print a

如果需要修改變量的值,可以使用 set 命令,例如:

set var a = 20

繼續執行程序
在查看和修改變量后,可以使用 continue 命令繼續執行程序:

continue

三、外網訪問樹莓派

  1. 打開端口的防火墻
sudo ufw allow 9623

將9623設為反向代理的端口

  1. 設置SSH配置文件
GatewayPorts yes

然后重啟 SSH 服務:

sudo systemctl restart ssh
  1. 通過putty程序ssh連接樹莓派
    在這里插入圖片描述
  2. 登錄樹莓派后設置SSH反向代理
ssh -p 22 -qngfNTR [端口號]:localhost:22 [用戶名]@[IP]

在這里插入圖片描述

  1. 在阿里云服務器上查看監聽端口
ss -ntl

在這里插入圖片描述
有紅框中的端口就說明服務器和樹莓派成功連接

  1. 其他用戶通過ssh命令連接到樹莓派
ssh -p [你綁定的端口號] [樹莓派用戶]@云服務器地址

在這里插入圖片描述
可以看見其他用戶也能連接到樹莓派上了

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

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

相關文章

Logisim數字邏輯實訓——計數器設計與應用

4位遞增計數器 六進制計數器 十進制計數器 六十進制計數器 二十四進制計數器 計時器

發現“橫”字手寫有難度,對比兩個“橫”字

我發現手寫體“橫”字“好看”程度&#xff0c;難以比得上印刷體&#xff1a; 兩個從方正簡體啟體來的“橫”字&#xff1a; 哪個更好看&#xff1f;我是傾向于左邊一點。 <div style"transform: rotate(180deg); display: inline-block;"> 左邊是我從方正簡…

ubuntu 向右拖動窗口后消失了、找不到了

這是目前單顯示器的設置&#xff0c;因為實際只有1個顯示器&#xff0c;之前的設置如下圖所示&#xff0c;有2個顯示器&#xff0c;一個主顯示器&#xff0c;一個23寸的顯示器 ubuntu 22.04 系統 今天在操作窗口時&#xff0c;向右一滑&#xff0c;發現這個窗口再也不顯示了、找…

專精特新政策推動,B端UI設計如何賦能中小企業創新發展?

在當前數字化轉型浪潮下&#xff0c;專精特新政策為中小企業提供了強大的支持&#xff0c;助力其在細分領域實現專業化、精細化、特色化和創新化發展。B端UI設計作為提升企業數字化產品用戶體驗和工作效率的重要手段&#xff0c;能夠有效賦能中小企業創新發展。本文將探討專精特…

梯度下降代碼

整體流程 數據預處理:標準化->加一列全為1的偏置項 訓練:梯度下降,將數學公式轉換成代碼 預測 模型代碼 import numpy as np# 標準化函數&#xff1a;對特征做均值-方差標準化 # 返回標準化后的特征、新數據的均值和標準差&#xff0c;用于后續預測def standard(feats…

RAG 實戰|用 StarRocks + DeepSeek 構建智能問答與企業知識庫

文章作者&#xff1a; 石強&#xff0c;鏡舟科技解決方案架構師 趙恒&#xff0c;StarRocks TSC Member &#x1f449; 加入 StarRocks x AI 技術討論社區 https://mp.weixin.qq.com/s/61WKxjHiB-pIwdItbRPnPA RAG 和向量索引簡介 RAG&#xff08;Retrieval-Augmented Gen…

從零開始學A2A一:A2A 協議的高級應用與優化

A2A 協議的高級應用與優化 學習目標 掌握 A2A 高級功能 理解多用戶支持機制掌握長期任務管理方法學習服務性能優化技巧 理解與 MCP 的差異 分析多智能體場景下的優勢掌握不同場景的選擇策略 第一部分&#xff1a;多用戶支持機制 1. 用戶隔離架構 #mermaid-svg-Awx5UVYtqOF…

【C++】入門基礎【上】

目錄 一、C的發展歷史二、C學習書籍推薦三、C的第一個程序1、命名空間namespace2、命名空間的使用3、頭文件<iostream>是干什么的&#xff1f; 個人主頁<—請點擊 C專欄<—請點擊 一、C的發展歷史 C的起源可以追溯到1979年&#xff0c;當時Bjarne Stroustrup(本…

1panel第三方應用商店(本地商店)配置和使用

文章目錄 引言資源網站實戰操作說明 引言 1Panel 提供了一個應用提交開發環境&#xff0c;開發者可以通過提交應用的方式將自己的應用推送到 1Panel 的應用商店中&#xff0c;供其他用戶使用。由此衍生了一種本地應用商店的概念&#xff0c;用戶可以自行編寫應用配置并上傳到自…

Evidential Deep Learning和證據理論教材的區別(主要是概念)

最近終于徹底搞懂了Evidential Deep Learning&#xff0c;之前有很多看不是特別明白的地方&#xff0c;原來是和證據理論教材&#xff08;是的&#xff0c;不只是國內老師寫的&#xff0c;和國外的老師寫的教材出入也比較大&#xff09;的說法有很多不一樣&#xff0c;所以特地…

text-decoration: underline;不生效

必須得紀念一下&#xff0c;在給文本加下劃線時&#xff0c;發現在win電腦不生效&#xff0c;部分mac也不生效&#xff0c;只有個別的mac生效了&#xff0c;思考了以下幾種方面&#xff1a; 1.兼容性問題&#xff1f; 因為是electron項目&#xff0c;不存在瀏覽器兼容性問題&…

VUE SSR(服務端渲染)

&#x1f916; 作者簡介&#xff1a;水煮白菜王&#xff0c;一位前端勸退師 &#x1f47b; &#x1f440; 文章專欄&#xff1a; 前端專欄 &#xff0c;記錄一下平時在博客寫作中&#xff0c;總結出的一些開發技巧和知識歸納總結?。 感謝支持&#x1f495;&#x1f495;&#…

ARCGIS國土超級工具集1.5更新說明

ARCGIS國土超級工具集V1.5版本更新說明&#xff1a;因作者近段時間工作比較忙及正在編寫ARCGISPro國土超級工具集&#xff08;截圖附后&#xff09;的原因&#xff0c;故本次更新為小更新&#xff08;沒有增加新功能&#xff0c;只更新了已有的工具&#xff09;。本次更新主要修…

劉鑫煒履新共工新聞社新媒體研究院院長,賦能媒體融合新征程

2025年4月18日&#xff0c;大灣區經濟網戰略媒體共工新聞社正式對外宣布一項重要人事任命&#xff1a;聘任螞蟻全媒體總編劉鑫煒為新媒體研究院第一任院長。這一舉措&#xff0c;無疑是對劉鑫煒在新媒體領域卓越專業能力與突出行業貢獻的又一次高度認可&#xff0c;也預示著共工…

java基礎從入門到上手(九):Java - List、Set、Map

一、List集合 List 是一種用于存儲有序元素的集合接口&#xff0c;它是 java.util 包中的一部分&#xff0c;并且繼承自 Collection 接口。List 接口提供了多種方法&#xff0c;用于按索引操作元素&#xff0c;允許元素重復&#xff0c;并且保持插入順序。常用的 List 實現類包…

UWP發展歷程

通用Windows平臺(UWP)發展歷程 引言 通用Windows平臺(Universal Windows Platform, UWP)是微軟為實現"一次編寫&#xff0c;處處運行"的愿景而打造的現代應用程序平臺。作為微軟統一Windows生態系統的核心戰略組成部分&#xff0c;UWP代表了從傳統Win32應用向現代應…

git忽略已跟蹤的文件/指定文件

在項目開發中&#xff0c;有時候我們并不需要git跟蹤所有文件&#xff0c;而是需要忽略掉某些指定的文件或文件夾&#xff0c;怎么操作呢&#xff1f;我們分兩種情況討論&#xff1a; 1. 要忽略的文件之前并未被git跟蹤 這種情況常用的方法是在項目的根目錄下創建和編輯.gitig…

AI 組件庫是什么?如何影響UI的開發?

AI組件庫是基于人工智能技術構建的、面向用戶界面&#xff08;UI&#xff09;開發的預制模塊集合。它們結合了傳統UI組件&#xff08;如按鈕、表單、圖表&#xff09;與AI能力&#xff08;如機器學習、自然語言處理、計算機視覺&#xff09;&#xff0c;旨在簡化開發流程并增強…

【Win】 cmd 執行curl命令時,輸出 ‘命令管道位置 1 的 cmdlet Invoke-WebRequest 請為以下參數提供值: Uri: ’ ?

1.原因&#xff1a; 有一個名為 Invoke-WebRequest 的 CmdLet&#xff0c;其別名為 curl。因此&#xff0c;當您執行此命令時&#xff0c;它會嘗試使用 Invoke-WebRequest&#xff0c;而不是使用 curl。 2.解決辦法 在cmd中輸入如下命令刪除這個curl別名&#xff1a; Remov…

UE5 UE循環體里怎么寫延遲

注&#xff1a;需要修改UE循環藍圖節點或者自己新建個藍圖宏庫把UE循環節點的原來代碼粘貼進去修改。 一、For Loop With Delay 二、For Each Loop With Delay 示例使用&#xff1a; 標注參考出處&#xff1a;分享UE5自制Loop with delay宏&#xff0c;在loop循環中添加執行…