实现单机聊天程序。 父进程创建子进程,实现多任务。 父进程负责发信息(向 FIFO 里写数据),子进程负责接收信息( 从 FIFO 里读数据)。打开命名管道的用阻塞的方法打开。
时间: 2024-10-21 16:09:57 浏览: 28
fifo.rar_fifo_fifo lin_fifo linux_linux fifo_进程间通信
实现单机聊天程序的一个基本思路是利用Unix/Linux系统中的FIFO(也称为命名管道或无名管道)。下面是一个简单的步骤概述:
1. **创建FIFO文件**:首先,在父进程和子进程中共享一个FIFO文件。父进程需要使用`mkfifo`命令创建这个FIFO,例如:
```bash
# 在预期的位置创建FIFO
mkdir -p chat_pipe
mkfifo chat_pipe/chat.fifo
```
2. **打开FIFO**:父子进程分别使用非阻塞模式打开FIFO。在父进程中,通常用于写入消息:
```c
int write_fd = open("chat_pipe/chat.fifo", O_WRONLY | O_NONBLOCK);
```
子进程中用于接收消息:
```c
int read_fd = open("chat_pipe/chat.fifo", O_RDONLY | O_NONBLOCK);
```
3. **消息传递**:父进程通过`write()`函数将消息写入到FIFO,同时检查是否成功。如果发生阻塞,可以使用`select`或`poll`等I/O多路复用机制等待直到可以写入。
```c
char message[] = "Hello from parent!";
ssize_t bytes_written = write(write_fd, message, strlen(message));
if (bytes_written < 0 && errno == EAGAIN) {
// 如果写操作阻塞,处理它...
}
```
4. **子进程接收**:子进程通过`read()`函数从FIFO读取消息,同样注意可能出现的阻塞,并处理接收到的消息。
```c
char buffer[1024];
ssize_t bytes_read = read(read_fd, buffer, sizeof(buffer));
if (bytes_read < 0 && errno == EAGAIN) {
// 阻塞,处理...
}
printf("Received: %s\n", buffer);
```
5. **循环和关闭**:两个进程可以在无限循环中进行消息交换,直到结束程序。完成后记得关闭文件描述符。
```c
while (true) {
// 消息发送和接收...
}
close(write_fd);
close(read_fd);
```
阅读全文