linux进程通信

一、linux中的talk程序

1.talk程序

talk 程序是 Linux 系统中的一个经典工具,用于实现​​终端用户之间的实时文本通信​​。它诞生于早期网络环境,允许多个用户在同一台主机(或不同主机)上通过命令行终端发送和接收消息,类似于现代即时通讯工具的雏形。

2.通过talk程序与其他用户聊天

装好talk服务(此过程问deepseek)

输入talk命令:

talk username@对方IP  # 在同一服务器内可直接 `talk username`

成功后就可以跟对方聊天了

二、linux进程间通信

1.进程间通信(IPC)是什么

想象两个独立的程序(进程):

​​进程A​​:负责监控温度传感器(每秒检测一次温度)
​​进程B​​:负责控制空调开关(需要根据温度调整)
它们需要协作,但:

进程A和B是独立运行的程序(甚至可能是不同开发者写的)
它们的内存空间完全隔离,无法直接互相访问变量
​​👉 此时必须用 IPC​​:进程A将温度数据通过某种方式(如消息队列)发送给进程B。

2.使用消息队列(Message Queue)进行进程间通信

消息队列是System V IPC机制之一,适合在不同进程间传递结构化消息。

PS:下面操作是同一用户的两个进程(父子进程)之间的通信

创建文件夹建立message.c文件

写入代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>

// 定义消息结构体(必须包含long类型的消息类型字段)
struct msg_buffer {
    long msg_type;
    char msg_text[1024];
};

int main() {
    key_t key;
    int msgid;
    struct msg_buffer message;

    // 生成唯一键值
    if ((key = ftok(".", 'A')) == -1) {
        perror("ftok");
        exit(1);
    }

    // 创建消息队列(IPC_CREAT表示创建,0644是权限)
    if ((msgid = msgget(key, 0644 | IPC_CREAT)) == -1) {
        perror("msgget");
        exit(1);
    }

    pid_t pid = fork();
    if (pid == -1) {
        perror("fork");
        exit(1);
    }

    if (pid == 0) { // 子进程 - 消息接收者
        printf("[Receiver] Waiting for messages...\n");
        
        // 接收类型为1的消息
        if (msgrcv(msgid, &message, sizeof(message.msg_text), 1, 0) == -1) {
            perror("msgrcv");
            exit(1);
        }
        
        printf("[Receiver] Received: %s\n", message.msg_text);

        // 删除消息队列
        if (msgctl(msgid, IPC_RMID, NULL) == -1) {
            perror("msgctl");
            exit(1);
        }
    } else { // 父进程 - 消息发送者
        sleep(1); // 确保接收者先进入等待状态
        message.msg_type = 1;
        strcpy(message.msg_text, "Hello from sender process!");
        
        printf("[Sender] Sending message...\n");
        
        // 发送消息
        if (msgsnd(msgid, &message, sizeof(message.msg_text), 0) == -1) {
            perror("msgsnd");
            exit(1);
        }
        
        printf("[Sender] Message sent.\n");
    }

    return 0;
}

编译运行后结果如下:

3.一些疑惑

由于本人对Linux不熟悉,做这个实验的时候 有很多疑惑,比如进程间通信是什么,进程之间为什么要通信,这和直接通过代码输出(如prinft)有什么区别(有点菜,比较懵逼),之后通过询问deepseek有了进一步的了解。现做一点分享

进程间通信是什么我已经写在前面了,另一个问题IPC与printf的疑惑,printf 只是输出到终端​​:它只是将信息显示给用户,​​其他进程无法获取这个输出内容​​。​​IPC 是进程间的数据传递​​:比如消息队列、管道等,允许数据被其他程序主动读取和使用。printf 输出到终端后,其他进程是无法直接捕获这些内容的。

特性printfIPC(如消息队列)
作用对象当前进程的终端输出其他进程
数据生命周期输出后无法被程序再次读取数据持久化在 IPC 机制中
跨进程能力❌ 不能✅ 能
典型用途调试/用户显示进程协作/数据交换

三、总结

这次学习了talk程序并与其他用户进行了文字聊天。然后用c语言写一个linux进程之间通信的简单程序,使用的是消息管道,只不过实现的是同一用户下两个进程之间的通信,未实现不同用户之间的通信,后续有机会将会继续完善。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值