一、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 输出到终端后,其他进程是无法直接捕获这些内容的。
| 特性 | printf | IPC(如消息队列) |
|---|---|---|
| 作用对象 | 当前进程的终端输出 | 其他进程 |
| 数据生命周期 | 输出后无法被程序再次读取 | 数据持久化在 IPC 机制中 |
| 跨进程能力 | ❌ 不能 | ✅ 能 |
| 典型用途 | 调试/用户显示 | 进程协作/数据交换 |
三、总结
这次学习了talk程序并与其他用户进行了文字聊天。然后用c语言写一个linux进程之间通信的简单程序,使用的是消息管道,只不过实现的是同一用户下两个进程之间的通信,未实现不同用户之间的通信,后续有机会将会继续完善。

2007

被折叠的 条评论
为什么被折叠?



