五一假期作業

sub_process.c

#include <stdio.h>         // 標準輸入輸出庫
#include <pthread.h>       // POSIX線程庫
#include <sys/ipc.h>       // IPC基礎定義(如消息隊列/共享內存)
#include <sys/msg.h>       // 消息隊列操作相關
#include <sys/shm.h>        // 共享內存操作相關
#include <unistd.h>         // 標準符號常量和類型
#include <string.h>         // 字符串操作相關#define NUM_THREADS 4      // 定義線程數量為4
#define MAX_MSG_SIZE 1024  // 定義單條消息的最大長度// 消息隊列數據結構
struct msg_buffer 
{long msg_type;          // 消息類型標識(必須非0)char msg_text[MAX_MSG_SIZE]; // 實際消息內容緩沖區
};// 共享內存數據結構
struct shm_data
{int char_count[256];    // ASCII字符頻率統計數組(支持擴展ASCII)pthread_mutex_t lock;   // 互斥鎖保護共享數據
};int shmid; // 全局共享內存ID,供子進程或線程使用// 線程處理函數:負責從消息隊列讀取日志并統計字符
void* process_log(void* arg) 
{int msgid = *(int*)arg; // 從參數獲取消息隊列ID(潛在問題:傳遞局部變量地址)struct msg_buffer msg;  // 定義接收消息的臨時緩沖區// 阻塞式接收消息隊列中類型為1的消息ssize_t bytes_received = msgrcv(msgid, &msg, MAX_MSG_SIZE, 1, 0);if (bytes_received == -1){perror("msgrcv"); // 如果接收失敗則打印錯誤信息return NULL;}// 將共享內存附加到當前進程的地址空間struct shm_data* shm = shmat(shmid, NULL, 0);if (shm == (void*)-1) {perror("shmat"); // 如果附加失敗則打印錯誤信息return NULL;}// 遍歷接收到的消息內容進行字符統計for (int i = 0; i < bytes_received; i++) {   unsigned char c = msg.msg_text[i]; // 取當前字符(無符號避免負數索引)pthread_mutex_lock(&shm->lock);     // 加鎖保護共享數據shm->char_count[c]++;              // 對應字符計數+1pthread_mutex_unlock(&shm->lock);  // 解鎖}shmdt(shm); // 分離共享內存(不影響其他進程/線程的掛接)return NULL;
}int main() {// 生成IPC對象唯一鍵值(基于文件路徑和項目ID)key_t key = ftok("/tmp/logfile", 65);if (key == -1){perror("ftok"); // 如果生成失敗則退出程序return 1;}// 創建消息隊列(權限0666,若不存在則創建)int msgid = msgget(key, 0666 | IPC_CREAT);if (msgid == -1) {perror("msgget"); // 如果獲取失敗則退出程序return 1;}// 創建共享內存段(大小為shm_data結構體,權限0666,若不存在則創建)shmid = shmget(key, sizeof(struct shm_data), 0666 | IPC_CREAT);if (shmid == -1){perror("shmget"); // 如果創建失敗則退出程序return 1;}// 將共享內存附加到當前進程地址空間并進行初始化struct shm_data* shm = shmat(shmid, NULL, 0);memset(shm, 0, sizeof(struct shm_data)); // 清空共享內存內容pthread_mutex_init(&shm->lock, NULL);    // 初始化互斥鎖// 創建線程池(NUM_THREADS個線程)pthread_t threads[NUM_THREADS];for (int i = 0; i < NUM_THREADS; i++) {// 創建線程并傳遞消息隊列ID指針(潛在問題:msgid是棧變量)if (pthread_create(&threads[i], NULL, process_log, &msgid) != 0){perror("pthread_create"); // 如果線程創建失敗則退出程序return 1;}}// 等待所有線程執行完畢for (int i = 0; i < NUM_THREADS; i++) {pthread_join(threads[i], NULL);}// 分離共享內存(主進程不再需要訪問)shmdt(shm);return 0;
}

main_process.c

#include <stdio.h>         // 標準輸入輸出庫
#include <sys/ipc.h>       // IPC基礎定義(消息隊列/共享內存等)
#include <sys/shm.h>        // 共享內存操作相關函數
#include <pthread.h>       // POSIX線程庫
#include <unistd.h>         // 標準符號常量和類型// 共享內存結構體(與子進程保持一致)
struct shm_data 
{int char_count[256];    // ASCII字符頻率統計數組(支持擴展ASCII)pthread_mutex_t lock;   // 互斥鎖保護共享數據
};int main() 
{// 生成唯一鍵值(基于文件路徑和項目ID)key_t key = ftok("/tmp/logfile", 65);if (key == -1){perror("ftok"); // 如果生成鍵值失敗則退出程序return 1;}// 創建或獲取共享內存段(大小為shm_data結構體)int shmid = shmget(key, sizeof(struct shm_data), 0666 | IPC_CREAT);if (shmid == -1) {perror("shmget"); // 如果獲取共享內存失敗則退出程序return 1;}// 將共享內存映射到當前進程地址空間struct shm_data* shm = shmat(shmid, NULL, 0);if (shm == (void*)-1) {perror("shmat"); // 如果映射失敗則退出程序return 1;}// 實時監控循環(永久運行直到程序被強制終止)while (1) {sleep(1); // 每隔1秒更新一次統計信息// 加鎖以保護共享數據pthread_mutex_lock(&shm->lock);printf("===== 字符統計 =====");// 遍歷所有可能的ASCII字符for (int i = 0; i < 256; i++) {if (shm->char_count[i] > 0) // 僅顯示出現過的字符{if (i == ' ') {printf("空格: %d", shm->char_count[i]); // 特殊處理空格字符} else {printf("%c: %d", (char)i, shm->char_count[i]); // 顯示可打印字符}}}// 解鎖以允許其他線程訪問pthread_mutex_unlock(&shm->lock);}// 分離共享內存(實際上不會執行到這里)shmdt(shm);return 0;
}

monitor.c

#include <stdio.h>         // 標準輸入輸出庫
#include <sys/ipc.h>       // IPC基礎定義(消息隊列/共享內存等)
#include <sys/shm.h>        // 共享內存操作相關函數
#include <pthread.h>       // POSIX線程庫
#include <unistd.h>         // 標準符號常量和類型// 共享內存結構體(與子進程保持一致)
struct shm_data 
{int char_count[256];    // ASCII字符頻率統計數組(支持擴展ASCII)pthread_mutex_t lock;   // 互斥鎖保護共享數據
};int main() 
{// 生成唯一鍵值(基于文件路徑和項目ID)key_t key = ftok("/tmp/logfile", 65);if (key == -1){perror("ftok"); // 如果生成鍵值失敗則退出程序return 1;}// 創建或獲取共享內存段(大小為shm_data結構體)int shmid = shmget(key, sizeof(struct shm_data), 0666 | IPC_CREAT);if (shmid == -1) {perror("shmget"); // 如果獲取共享內存失敗則退出程序return 1;}// 將共享內存映射到當前進程地址空間struct shm_data* shm = shmat(shmid, NULL, 0);if (shm == (void*)-1) {perror("shmat"); // 如果映射失敗則退出程序return 1;}// 實時監控循環(永久運行直到程序被強制終止)while (1) {sleep(1); // 每隔1秒更新一次統計信息// 加鎖以保護共享數據pthread_mutex_lock(&shm->lock);printf("===== 字符統計 =====");// 遍歷所有可能的ASCII字符for (int i = 0; i < 256; i++) {if (shm->char_count[i] > 0) // 僅顯示出現過的字符{if (i == ' ') {printf("空格: %d", shm->char_count[i]); // 特殊處理空格字符} else {printf("%c: %d", (char)i, shm->char_count[i]); // 顯示可打印字符}}}// 解鎖以允許其他線程訪問pthread_mutex_unlock(&shm->lock);}// 分離共享內存(實際上不會執行到這里)shmdt(shm);return 0;
}
編譯和運行
# 創建共享內存鍵值文件
touch /tmp/logfile# 編譯代碼
gcc main_process.c -o main_process
gcc sub_process.c -o sub_process -lpthread
gcc monitor.c -o monitor -lpthread# 生成測試日志
base64 /dev/urandom | head -n 1000 > test.log# 按順序啟動進程
./sub_process &
./monitor &
./main_process

手動終止進程

  1. 查找進程ID
    在終端中執行以下命令,找到相關進程的PID:

    ps aux | grep -E 'main_process|sub_process|monitor'
    
  2. 終止進程
    使用?kill?命令逐個終止進程:

牛客網刷題

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

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

相關文章

Liunx安裝Apache Tomcat

目錄 一、了解tomcat 二、下載 三、啟動tomcat 四、網頁訪問tomcat 五、Tomcat修改默認8080端口 六、Tomcat創建項目步驟-實現項目對外訪問 一、了解tomcat Apache Tomcat 是一個開源的 Java Servlet 容器 和 Web 服務器&#xff0c;主要用于運行基于 Java 的 Web 應用…

破局者手冊 Ⅰ:測試開發核心基礎,解鎖未來測試密鑰!

目錄 一、引入背景 二、軟件測試基礎概念 2.1 軟件測試的定義 2.2 軟件測試的重要性 2.3 軟件測試的原則 三、測試類型 3.1 功能測試 3.2 接口測試 3.2.1 接口測試的概念 3.2.2 接口測試的重要性 3.2.3 接口測試的要點 3.2.4 接口測試代碼示例&#xff08;Python r…

C++ 適配器模式詳解

適配器模式&#xff08;Adapter Pattern&#xff09;是一種結構型設計模式&#xff0c;它允許不兼容的接口之間能夠協同工作。 概念解析 適配器模式的核心思想是&#xff1a; 接口轉換&#xff1a;將一個類的接口轉換成客戶希望的另一個接口 兼容性&#xff1a;使原本由于接…

【NLP】 28. 語言模型的評估方式:MRR, PERPLEXITY, BLEU, WER從困惑度到實際效果

語言模型的評估方式&#xff1a;從困惑度到實際效果 評估語言模型&#xff08;LLM&#xff09;是否有效&#xff0c;并不僅僅是看它生成句子是否“聽起來通順”&#xff0c;我們需要定量的指標對模型性能做出系統性評價。評估方法主要分為兩大類&#xff1a; 內在評價&#x…

Java 企業級開發設計模式全解析

Java 企業級開發設計模式全解析 在 Java 企業級開發的復雜領域中&#xff0c;設計模式如同精湛的工匠工具&#xff0c;能夠幫助開發者構建高效、可維護、靈活且健壯的軟件系統。它們是無數開發者在長期實踐中總結出的解決常見問題的最佳方案&#xff0c;掌握這些模式對于提升開…

小剛說C語言刷題—1038編程求解數學中的分段函數

1.題目描述 編程求解數學中的分段函數。 …………x1 (當 x>0 )。 yf(x)…0 (當 x0 )。 ………x?1 (當 x<0 )。 上面描述的意思是&#xff1a; 當x>0 時 yx1 ; 當 x0 時 y0 ; 當 x<0 時 yx?1 。 輸入 輸入一行&#xff0c;只有一個整數x(?30000≤x≤30…

滾珠螺桿的精度如何保持?

滾珠螺桿通常用于需要精確定位的地方&#xff0c;高機械效率、低傳遞扭矩和幾乎為零的軸向游隙&#xff0c;使滾珠螺桿成為工具定位和飛機副翼驅動等應用中的重要設備。但是&#xff0c;連續工作產生的阻力和熱量會導致較大的摩擦力和定位誤差。那么&#xff0c;滾珠螺桿的精度…

在 Laravel 中深度集成 Casbin 到原生 Auth 系統

在 Laravel 中深度集成 Casbin 到原生 Auth 系統需要實現多層次的融合&#xff0c;以下是專業級實現方案&#xff1a; 一、核心集成架構 #mermaid-svg-WYM1aoAyHrR5bCdp {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-…

JavaScript 實現輸入框的撤銷功能

在 Web 開發中&#xff0c;為輸入框添加撤銷功能可以極大地提升用戶體驗&#xff0c;方便用戶快速回滾到之前的輸入狀態。本文將通過一段簡單的 HTML、CSS 和 JavaScript 代碼&#xff0c;詳細介紹如何實現輸入框的撤銷功能。 整體實現思路 利用 JavaScript 監聽輸入框的inpu…

計算機視覺與深度學習 | 點云配準算法綜述(1992-2025)

點云配準算法綜述(1992-2025) 點云配準 點云配準算法綜述(1992-2025)一、傳統方法(1992-2020)1. **ICP(Iterative Closest Point)**2. **NDT(Normal Distributions Transform)**3. **4PCS(4-Points Congruent Sets)**二、深度學習驅動的方法(2018-2025)1. **Poin…

數據庫的二級索引

二級索引 10.1 二級索引作為額外的鍵 表結構 正如第8章提到的&#xff0c;二級索引本質上是包含主鍵的額外鍵值對。每個索引通過B樹中的鍵前綴來區分。 type TableDef struct {// 用戶定義的部分Name stringTypes []uint32 // 列類型Cols []string // 列名Indexes …

Java IO流核心處理方式詳解

一、IO流概述 Java IO&#xff08;Input/Output&#xff09;流是處理輸入輸出操作的核心機制&#xff0c;通過流&#xff08;Stream&#xff09;的形式實現設備間的數據傳輸。所有操作都基于以下兩個核心抽象&#xff1a; InputStream/OutputStream&#xff1a;字節流基類 Re…

WidowX-250s 機械臂的簡單數字孿生案例

前面一段時間記錄了一下WidowX-250s機械臂的學習與遙操作演示&#xff0c;相關鏈接如下&#xff1a; WidowX-250s 機械臂學習記錄&#xff1a; https://blog.csdn.net/qq_54900679/article/details/145556979 WidowX-250s 機械臂遙操作演示記錄&#xff1a; https://blog.c…

uniapp 云開發全集 云開發的概念

一、云開發的概念 1.1 云開發介紹 云開發 unicloud 是 DCloud 聯合阿里云、騰訊云、支付寶云&#xff0c;為開發者提供的基于 serverless 模式和 js 編程的云開發平臺&#xff0c;可以使用極小的成本代價開發具輕松實現前后臺整體業務。 1.2 云開發的核心組成 云開發的核心組…

GGD獨立站的優勢

GGD模式(基于Google生態的獨立站模式)越來越受歡迎&#xff0c;主要有以下原因&#xff1a; 1. 全球化覆蓋 GGD獨立站依托Google強大的生態系統&#xff0c;能夠幫助企業輕松觸達全球用戶&#xff0c;實現國際化布局&#xff0c;拓展業務范圍。Google作為全球最大的搜索引擎&…

簽名去背景圖像處理實例

一、前言 在生活中我們經常用到電子簽名&#xff0c;但有時候我們所獲取的圖像的彩色圖像&#xff0c;我們需要獲取白底黑字的電子簽名&#xff0c;我們可以通過下面程序對彩色圖像進行處理達到我們的處理目的。 原始彩色圖像如下&#xff1a; 二、程序和運行結果 clear all;c…

WebAssembly(Wasm):現代Web開發的超級加速器

在當今的Web開發領域&#xff0c;性能和效率是開發者們永恒的追求目標。隨著Web應用的復雜度不斷增加&#xff0c;傳統的JavaScript在某些場景下已經難以滿足高性能計算和復雜邏輯處理的需求。此時&#xff0c;WebAssembly&#xff08;Wasm&#xff09;作為一種新興的Web技術&a…

簡單理解MCP:AI如何使用工具

簡單理解MCP&#xff1a;AI如何使用工具&#xff08;以天氣/新聞服務為例&#xff09; 你是否注意到人工智能(AI)助手正變得越來越智能&#xff1f;它們不再僅僅是聊天&#xff0c;還能執行實際操作&#xff0c;比如查詢天氣、在線搜索&#xff0c;甚至預訂會議。這通常涉及到…

護網奇談: 紅隊工程師手記

零、引言&#xff1a;在演練中活著&#xff0c;在現實中消失 人們常說&#xff0c;護網是網絡安全界的“大閱兵”。 每年一次&#xff0c;紅藍對陣&#xff0c;政企聯動&#xff0c;戰鼓擂響&#xff0c;態勢大屏高掛&#xff0c;PPT如潮&#xff0c;報告成山。 你在屏幕前看…

機器翻譯與數據集

機器翻譯與數據集 語言模型是自然語言處理的關鍵&#xff0c;而機器翻譯是語言模型最成功的基準測試。因為機器翻譯正是將輸入序列轉換成輸出序列的序列轉換模型&#xff08;sequence transduction&#xff09;的核心問題。序列轉換模型在各類現代人工智能應用中發揮著至關重要…