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


相关推荐
炽烈小老头14 分钟前
【 每天学习一点算法 2026/04/22】四数相加 II
学习·算法
uncle_ll21 分钟前
LangChain基础学习笔记
笔记·学习·langchain·llm·rag
songx_9928 分钟前
Linux基础2
linux·运维·服务器
我想要SSR32 分钟前
搭建小龙虾过程和坑点
linux·服务器·ai
三品吉他手会点灯35 分钟前
C语言学习笔记 - 14.C编程预备计算机专业知识 - 本讲内容概述
c语言·笔记·学习
Thanwind37 分钟前
从0开始的机器学习之旅(二):监督学习,从线性回归说起
学习·机器学习·线性回归
2501_9423264439 分钟前
易速乐考,轻松备考
学习·教育电商
菜鸟‍41 分钟前
【CVPR 2026】LitePT:更轻、更强的点云 Transformer【论文学习】
深度学习·学习·transformer
斯维赤1 小时前
每天学习一个小算法:归并排序
学习·算法·排序算法
椰羊~王小美1 小时前
实践项目来串联概念(嵌入式、网络、后端、前端、AI)
学习