目錄
- 一、什么是守護進程以及如何創建守護進程
- 1. 什么是守護進程?
- 2. 如何創建守護進程?
- 二、什么是GDB調試以及如何用GDB命令調試C程序
- 1. 什么是GDB?
- 2. 如何用GDB命令調試C程序?
- 三、外網訪問樹莓派
一、什么是守護進程以及如何創建守護進程
1. 什么是守護進程?
守護進程(Daemon Process)是一種特殊的后臺進程,它獨立于控制終端,并且周期性地執行某種任務或者等待處理特定事件。守護進程通常在系統啟動時開始運行,直到系統關閉才結束,它們為系統提供各種服務,例如 Web 服務器、郵件服務器、日志記錄等
2. 如何創建守護進程?
編程實現守護進程的主要過程:
- 創建子進程并終止父進程:通過 fork() 創建子進程,父進程退出,子進程繼續運行。
- 創建新的會話:調用 setsid() 創建新的會話,使進程成為會話領導者,從而脫離原來的終端。
- 改變工作目錄:通常將工作目錄更改為根目錄 /,避免因原工作目錄被卸載而導致的進程終止。
- 重設文件權限掩碼:調用 umask(0) 設置適當的文件權限掩碼,確保守護進程創建的文件具有正確的權限。
- 關閉文件描述符:關閉所有不需要的文件描述符,避免資源泄漏。
- 重定向標準輸入、輸出和錯誤:將標準輸入、輸出和錯誤重定向到 /dev/null 或日志文件。
- 進入主循環:守護進程進入主循環,周期性地執行任務。
創建一個守護進程的三種方法:
由于阿里云服務器暫時無法登錄,所以下面只展示在樹莓派上的操作。
- 使用 nohup 命令
在阿里云服務器或樹莓派上,可以使用以下命令創建守護進程:
nohup ./your_program > output.log 2>&1 &
nohup
使程序忽略 SIGHUP
信號,即使終端關閉,程序也會繼續運行。
“>
” 將標準輸出重定向到 output.log
文件。
2>&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
- 使用 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
三、外網訪問樹莓派
- 打開端口的防火墻
sudo ufw allow 9623
將9623設為反向代理的端口
- 設置SSH配置文件
GatewayPorts yes
然后重啟 SSH 服務:
sudo systemctl restart ssh
- 通過putty程序ssh連接樹莓派
- 登錄樹莓派后設置SSH反向代理
ssh -p 22 -qngfNTR [端口號]:localhost:22 [用戶名]@[IP]
- 在阿里云服務器上查看監聽端口
ss -ntl
有紅框中的端口就說明服務器和樹莓派成功連接
- 其他用戶通過ssh命令連接到樹莓派
ssh -p [你綁定的端口號] [樹莓派用戶]@云服務器地址
可以看見其他用戶也能連接到樹莓派上了