实现阿里云服务器上的文字聊天程序以及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.mzph.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;把所有数的总和的一…