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


相关推荐
人生游戏牛马NPC1号43 分钟前
学习 Flutter (三):玩安卓项目实战 - 上
android·学习·flutter
冰橙子id1 小时前
linux-远程访问管理(sshd,scp,sftp)
linux·网络·ssh
光电的一只菜鸡2 小时前
ubuntu之坑(十五)——设备树
linux·数据库·ubuntu
saynaihe4 小时前
ubuntu 22.04 anaconda comfyui安装
linux·运维·服务器·ubuntu
企鹅与蟒蛇4 小时前
Ubuntu-25.04 Wayland桌面环境安装Anaconda3之后无法启动anaconda-navigator问题解决
linux·运维·python·ubuntu·anaconda
小蜜蜂爱编程4 小时前
ubuntu透网方案
运维·服务器·ubuntu
没有羊的王K4 小时前
SSM框架学习——day1
java·学习
程序设计实验室4 小时前
小心误关了NAS服务器!修改Linux的电源键功能
linux·nas
AI视觉网奇4 小时前
git 访问 github
运维·开发语言·docker
头发那是一根不剩了5 小时前
nginx:SSL_CTX_use_PrivateKey failed
运维·服务器