實現阿里云服務器上的文字聊天程序以及C語言寫的進程間通信(IPC)程序

實現阿里云服務器上的文字聊天程序以及C語言寫的進程間通信(IPC)程序

1. 基于 Linux 中的管道進行進程間通信

我們首先使用管道進行進程間通信,這對于簡單的聊天程序來說是一個比較簡單且實用的方法。

步驟:
  1. 創建管道:管道用于兩個進程間的單向通信。我們需要用 pipe() 函數來創建管道。
  2. 進程間通信:父進程和子進程通過管道交換信息。
  3. 實現聊天功能:父進程可以通過管道向子進程發送消息,子進程可以通過管道接收并顯示消息,反之亦然。
代碼實現:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>#define MAX_MESSAGE_LENGTH 256void chat_process(int pipe_fd[2]) {char message[MAX_MESSAGE_LENGTH];close(pipe_fd[1]);  // 關閉寫端,父進程將消息寫入管道,子進程從管道中讀取while (1) {read(pipe_fd[0], message, MAX_MESSAGE_LENGTH);if (strcmp(message, "exit\n") == 0) {break;}printf("Received message: %s", message);}close(pipe_fd[0]);  // 關閉讀端
}void chat_parent(int pipe_fd[2]) {char message[MAX_MESSAGE_LENGTH];close(pipe_fd[0]);  // 關閉讀端while (1) {printf("Enter message to send: ");fgets(message, MAX_MESSAGE_LENGTH, stdin);if (strcmp(message, "exit\n") == 0) {write(pipe_fd[1], message, strlen(message) + 1);break;}write(pipe_fd[1], message, strlen(message) + 1);}close(pipe_fd[1]);  // 關閉寫端
}int main() {pid_t pid;int pipe_fd[2];if (pipe(pipe_fd) == -1) {perror("pipe");exit(1);}pid = fork();if (pid < 0) {perror("fork");exit(1);}if (pid == 0) {// 子進程執行chat_processchat_process(pipe_fd);} else {// 父進程執行chat_parentchat_parent(pipe_fd);wait(NULL);  // 等待子進程結束}return 0;
}
解釋:
  • 該程序使用管道(pipe_fd)進行進程間通信。
  • 父進程通過管道寫入消息,子進程通過管道讀取消息并顯示。
  • 當輸入"exit"時,父進程和子進程都會退出聊天程序。
  • 父進程和子進程之間通過管道進行簡單的文字通信。

2. 在阿里云服務器上進行聊天

  1. 登錄阿里云服務器

    • 你需要通過 SSH 登錄到阿里云的服務器。使用終端命令:

      ssh username@your_server_ip
      
  2. 編譯和運行程序

    • 先將上面的 C 語言代碼保存到文件中(例如 chat.c)。

    • 編譯 C 程序:

      gcc -o chat chat.c
      
    • 運行編譯后的程序:

      ./chat
      
  3. 多個用戶之間的聊天

    • 你可以在阿里云上啟動多個終端,并分別運行不同的進程,通過 IPC 機制(例如管道)進行進程間的通信。
    • 每個終端都運行上述程序并模擬聊天,雖然它們是不同的進程,但通過管道可以實現相互間的消息交換。

3. 使用消息隊列(另一種 IPC 方式)

如果你想嘗試另一種進程間通信的方式,可以使用消息隊列(Message Queue)。這是 Linux 中另一種常見的 IPC 方法。

代碼實現使用消息隊列:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>#define MAX_MESSAGE_LENGTH 256
#define MSG_KEY 1234struct msg_buffer {long msg_type;char msg_text[MAX_MESSAGE_LENGTH];
};void chat_process(int msgid) {struct msg_buffer message;while (1) {msgrcv(msgid, &message, sizeof(message), 1, 0);printf("Received message: %s", message.msg_text);if (strcmp(message.msg_text, "exit\n") == 0) {break;}}
}void chat_parent(int msgid) {struct msg_buffer message;while (1) {printf("Enter message to send: ");fgets(message.msg_text, MAX_MESSAGE_LENGTH, stdin);message.msg_type = 1;msgsnd(msgid, &message, sizeof(message), 0);if (strcmp(message.msg_text, "exit\n") == 0) {break;}}
}int main() {pid_t pid;int msgid;msgid = msgget(MSG_KEY, 0666 | IPC_CREAT);if (msgid == -1) {perror("msgget");exit(1);}pid = fork();if (pid < 0) {perror("fork");exit(1);}if (pid == 0) {// 子進程執行chat_processchat_process(msgid);} else {// 父進程執行chat_parentchat_parent(msgid);wait(NULL);  // 等待子進程結束}msgctl(msgid, IPC_RMID, NULL);  // 刪除消息隊列return 0;
}
解釋:
  • 消息隊列msgget用于創建一個消息隊列。
  • 父進程通過msgsnd發送消息,子進程通過msgrcv接收消息。
  • 當輸入"exit"時,程序會退出。

總結:

  1. 使用管道和消息隊列都是 Linux 中常見的進程間通信方法。根據需要選擇適合的方式。
  2. 可以在阿里云服務器上運行這些程序來模擬進程間的聊天。
  3. 在此基礎上,可以進一步擴展聊天程序,比如加入多用戶支持、網絡通信等功能。

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

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

相關文章

COMSOL 與人工智能融合的多物理場應用:28個案例的思路、方法與工具概述

應用案例概述 基于 COMSOL 與人工智能&#xff08;AI&#xff09;結合的應用案例涵蓋了 28 個多領域場景&#xff0c;包括工程&#xff08;如熱傳導優化、結構力學預測&#xff09;、能源&#xff08;如電池熱管理、燃料電池性能&#xff09;、生物醫學&#xff08;如藥物傳遞…

SAN及其ZONE

目錄 一、什么是SAN? 二、什么是ZONE? 三、配置ZONE 2.1 核心概念 2.2 劃分原則 2.3 Zone劃分最佳實踐 2.4 配置語法 1). 基于端口&#xff08;Domain,Port&#xff09;的zone語法 2). 基于WWN&#xff08;World Wide Name&#xff09;的Zone語法 3). 使用Alias簡化配置 4).…

Springboot框架—單元測試操作

Springboot單元測試的操作步驟&#xff1a; 1.添加依賴spring-boot-starter-test 在pom.xml中添加依賴spring-boot-starter-test 2.在src/test/java下新建java class 3.單元測試入口代碼結構 import org.junit.Test; import org.junit.runner.RunWith; import org.springfra…

用AbortController取消事件綁定

視頻教程 React - &#x1f914; Abort Controller 到底是什么神仙玩意&#xff1f;看完這個視頻你就明白了&#xff01;&#x1f4a1;_嗶哩嗶哩_bilibili AbortController的好處之一是事件綁定的函數已無需具名函數,匿名函數也可以被取消事件綁定了 //該代碼2秒后點擊失效…

JavaScript性能優化(上)

1. 減少 DOM 操作 減少 DOM 操作是優化 JavaScript 性能的重要方法&#xff0c;因為頻繁的 DOM 操作會導致瀏覽器重繪和重排&#xff0c;從而影響性能。以下是一些具體的策略和技術&#xff0c;可以幫助有效減少 DOM 操作&#xff1a; 1.1. 批量更新 DOM 親切與母體&#xff…

OpenCV 圖形API(14)用于執行矩陣(或圖像)與一個標量值的逐元素乘法操作函數mulC()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 描述 將矩陣與標量相乘。 mulC 函數將給定矩陣 src 的每個元素乘以一個給定的標量值&#xff1a; dst ( I ) saturate ( src1 ( I ) ? multiplier ) \…

持續集成與Jenkins安裝使用教程

一、持續集成與Jenkins 持續集成&#xff08;Continuous integration&#xff0c;簡稱CI&#xff09;指的是&#xff0c;頻繁地&#xff08;一天多次&#xff09;將代碼集成到主干。 持續集成的目的&#xff0c;就是讓產品可以快速迭代&#xff0c;同時還能保持高質量。 它的…

TIM定時器

一、TIM定時器 STM32高級定時器實戰&#xff1a;PWM、捕獲與死區控制詳解-CSDN博客 玩轉STM32_rivencode的博客-CSDN博客 二、相關函數 1.TIM_TimeBaseInitTypeDef結構體講解 typedef struct {uint16_t TIM_Prescaler; // 預分頻器&#xff0c;用于設置定時器計數頻…

Python 小練習系列 | Vol.14:掌握偏函數 partial,用函數更絲滑!

&#x1f9e9; Python 小練習系列 | Vol.14&#xff1a;掌握偏函數 partial&#xff0c;用函數更絲滑&#xff01; 本節的 Python 小練習系列我們將聚焦一個 冷門但高能 的工具 —— functools.partial。它的作用類似于“函數的預設模板”&#xff0c;能幫你寫出更加靈活、優雅…

開源 PDF.js 文件編輯操作

一、PDF.js PDF.js 是 Mozilla 基金會推出的一個使用 HTML5 構建的 PDF 閱讀器&#xff0c;它完全使用 JavaScript 編寫。作為 Firefox 瀏覽器的默認 PDF 查看器&#xff0c;PDF.js 具有強大的兼容性和穩定性。它不僅支持 PDF 文件的查看和渲染&#xff0c;還提供了豐富的交互…

3D珠寶渲染用什么軟件比較好?渲染100邀請碼1a12

印度珠寶商 Mohar Fine Jewels 和英國寶石商 Gemfields 在今年推出了合作珠寶系列——「Emeralds in Full Bloom」&#xff0c;它的靈感源自花草綻放的春季田野&#xff0c;共有 39 件作品&#xff0c;下面這個以植物為主題的開口手鐲就是其中一件。 在數字時代&#xff0c;像這…

增益調度控制 —— 理論、案例與交互式 GUI 實現

目錄 增益調度控制 —— 理論、案例與交互式 GUI 實現一、引言二、增益調度控制的基本原理三、數學模型與公式推導四、增益調度控制的優勢與局限4.1 優勢4.2 局限五、典型案例分析5.1 案例一:航空飛行控制中的增益調度5.2 案例二:發動機推力控制中的增益調度5.3 案例三:化工…

PyTorch數據加載流程解析

1. 定義最簡單的Dataset import torch from torch.utils.data import Dataset, DataLoaderclass MyDataset(Dataset):def __init__(self, data):self.data data # 假設data是一個列表&#xff0c;如[10, 20, 30, 40]def __len__(self):return len(self.data) # 返回數據總量…

xsync腳本是一個基于rsync的工具

xsync腳本是一個基于rsync的工具&#xff0c;用于在集群間高效同步文件或目錄。以下是xsync腳本的詳細使用方法和配置步驟&#xff1a; 一、xsync腳本的作用 xsync腳本可以快速將文件或目錄分發到集群中的多個節點&#xff0c;避免了手動逐臺復制文件的繁瑣操作。它利用rsync…

250408_解決加載大量數據集速度過慢,耗時過長的問題

250408_解決加載Cifar10等大量數據集速度過慢&#xff0c;耗時過長的問題&#xff08;加載數據時多線程的坑&#xff09; 在做Cifar10圖像分類任務時&#xff0c;發現每個step時間過長&#xff0c;且在資源管理器中查看顯卡資源調用異常&#xff0c;主要表現為&#xff0c;顯卡…

Ansible的使用2

#### 一、Ansible變量 ##### facts變量 > facts組件是Ansible用于采集被控節點機器的設備信息&#xff0c;比如IP地址、操作系統、以太網設備、mac 地址、時間/日期相關數據&#xff0c;硬件信息等 - setup模塊 - 用于獲取所有facts信息 shell ## 常用參數 filter…

多模態大語言模型arxiv論文略讀(六)

FashionLOGO: Prompting Multimodal Large Language Models for Fashion Logo Embeddings ?? 論文標題&#xff1a;FashionLOGO: Prompting Multimodal Large Language Models for Fashion Logo Embeddings ?? 論文作者&#xff1a;Zhen Wang, Da Li, Yulin Su, Min Yang,…

MySQL深入

體系結構 連接層&#xff1a;主要處理客戶端的連接進行授權認證、校驗權限等相關操作 服務層&#xff1a;如sql的接口、解析、優化在這里完成&#xff0c;所有跨存儲引擎的操作在這里完成 引擎層&#xff1a;索引是在存儲引擎層實現的&#xff0c;所以不同的存儲引擎他的索引…

智能 SQL 優化工具 PawSQL 月度更新 | 2025年3月

&#x1f4cc; 更新速覽 本月更新包含 21項功能增強 和 9項問題修復&#xff0c;重點提升SQL解析精度與優化建議覆蓋率。 一、SQL解析能力擴展 ? 新增SQL語法解析支持 SELECT...INTO TABLE 語法解析&#xff08;3/26&#xff09; ALTER INDEX RENAME/VISIBLE 語句解析&#…

數組劃分使元素總和最接近

0劃分 - 藍橋云課 將一個數組劃分為兩個元素總和最接近的兩個數組 要使得兩組權值的乘積最大&#xff0c;根據數學原理&#xff0c;當兩組權值越接近時&#xff0c;它們的乘積就越大。因此&#xff0c;可以將這個問題轉化為一個 0 - 1 背包問題&#xff0c;把所有數的總和的一…