Linux学习-Linux进程间通信(IPC)聊天程序实践指南

一、在阿里云服务器上使用talk程序

Linux系统自带的talk命令可以让两个登录用户进行实时文字聊天:

  1. 用户A执行:`talk usernameB
  2. 用户B会收到通知,并需要执行:talk usernameA@hostname
  3. 然后双方就可以开始聊天了,屏幕会分成上下两部分

二、用C语言实现简单的进程间通信聊天程序

下面我将展示几种不同的IPC方式实现的简单聊天程序。

1. 使用命名管道(FIFO)

server.c (服务器端)

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stddef.h>  // 添加 size_t 的定义

#define FIFO_FILE "chat_fifo"

int main() {
    int fd;
    char readbuf[80];
    char end[10];
    int to_end;
    
    // 创建命名管道
    mkfifo(FIFO_FILE, 0666);
    
    while(1) {
        fd = open(FIFO_FILE, O_RDONLY);
        read(fd, readbuf, sizeof(readbuf));
        printf("Client: %s\n", readbuf);
        close(fd);
        
        printf("Server: ");
        fgets(readbuf, sizeof(readbuf), stdin);
        strcpy(end, "quit\n");
        to_end = strcmp(readbuf, end);
        
        if (to_end == 0) {
            fd = open(FIFO_FILE, O_WRONLY);
            write(fd, readbuf, strlen(readbuf));
            close(fd);
            break;
        }
        
        fd = open(FIFO_FILE, O_WRONLY);
        write(fd, readbuf, strlen(readbuf));
        close(fd);
    }
    
    unlink(FIFO_FILE);  // 删除FIFO文件
    return 0;
}

client.c (客户端)

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stddef.h>  // 添加 size_t 的定义

#define FIFO_FILE "chat_fifo"

int main() {
    int fd;
    char readbuf[80];
    char end[10];
    int to_end;
    
    while(1) {
        printf("Client: ");
        fgets(readbuf, sizeof(readbuf), stdin);
        strcpy(end, "quit\n");
        to_end = strcmp(readbuf, end);
        
        fd = open(FIFO_FILE, O_WRONLY);
        write(fd, readbuf, strlen(readbuf));
        close(fd);
        
        if (to_end == 0) {
            break;
        }
        
        fd = open(FIFO_FILE, O_RDONLY);
        read(fd, readbuf, sizeof(readbuf));
        printf("Server: %s\n", readbuf);
        close(fd);
    }
    
    return 0;
}

三、编译和运行

命名管道版本

  1. 编译:

    bash 复制代码
    gcc server.c -o server
    gcc client.c -o client
  2. 在两个不同的终端中分别运行:

    bash 复制代码
    ./server
    ./client


相关推荐
n***271918 分钟前
SQL Server 中行转列
运维·服务器
q***829132 分钟前
Nginx中$http_host、$host、$proxy_host的区别
运维·nginx·http
charlie11451419136 分钟前
使用 Poetry + VS Code 创建你的第一个 Flask 工程
开发语言·笔记·后端·python·学习·flask·教程
菥菥爱嘻嘻37 分钟前
langchain学习-RAG+prompt+OutPutParse
学习·langchain·prompt
Jing_jing_X38 分钟前
ChatGPT 四种模式:普通对话、推理思考、深度研究、学习模式有什么区别?
人工智能·学习·chatgpt
Claudedy44 分钟前
Linux 网络代理指南:解决下载慢、访问受限的开发痛点
linux·运维·网络·代理·proxy代理
q***146444 分钟前
RustDesk搭建公网中继服务器远控内网机器(完整版)
运维·服务器
AA陈超1 小时前
Lyra项目中的输入系统
c++·笔记·学习·游戏·ue5·lyra
zhaqonianzhu1 小时前
【保姆级】无外网 Linux 服务器用 VSCode 通义灵码:SSH 代理配置全流程
linux·服务器·vscode
Murphy_lx1 小时前
C++ 条件变量
linux·开发语言·c++