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


相关推荐
HalvmånEver42 分钟前
Linux:进程的切换与调度(进程四)
linux·运维·服务器
运维有小邓@1 小时前
实时日志关联分析工具:智能检测潜在安全威胁
运维·网络·安全
谷隐凡二1 小时前
Docker 的核心理念及技术的简单说明
运维·docker·容器
LCG元1 小时前
终端里的"黑客帝国":htop, glances, bpytop 系统监控工具横评
linux
L***B5681 小时前
如何安装linux版本的node.js
linux·运维·node.js
LCG元2 小时前
终极武器:用 systemd 管理你的自定义应用服务(附配置文件)
linux
Ma0407132 小时前
【机器学习】监督学习、无监督学习、半监督学习、自监督学习、弱监督学习、强化学习
人工智能·学习·机器学习
脏脏a2 小时前
【Linux】Linux进程状态深度解析
linux·运维·服务器
凉晓风2 小时前
Linux中常见几种自启动方式的区别
linux·运维·服务器
小熊officer2 小时前
Nginx学习
运维·学习·nginx