编写程序,用管道实现进程之间的通信。即server进程实现从管道中读取数据(输出数据及其长度),client进程实现从管道中写入数据。可设置读取或写入次数,便于让程序正常执行完毕。
时间: 2024-10-21 07:11:35 浏览: 16
电子科大操作系统实验课Linux通过管道实现进程间通信
5星 · 资源好评率100%
在Unix/Linux系统中,管道(pipe)是一种内建机制,允许不同进程之间通过共享文件描述符进行数据交换。下面是一个简单的示例,说明如何编写server和client进程,分别用于从管道读取数据和向管道写入数据:
**Server(读取端):**
```bash
#!/bin/bash
# 创建一个名为"pipe_data"的无名管道
mkfifo pipe_data
# 启动server进程并监听管道
while true; do
# 使用read命令读取管道中的数据,直到数据长度小于1或EOF
data=$(cat -n < pipe_data | head -n 1)
echo "Received Data: $data (length: ${#data})"
read -p "Enter 'q' to quit or press enter to continue: " response
[[ "$response" == 'q' ]] && break
done
# 关闭管道
rm pipe_data
```
在这个server进程中,它创建了一个无名的FIFO(file descriptor inbox),然后进入一个无限循环,等待client写入数据。每次读取一行数据,显示出来,并询问用户是否继续。
**Client(写入端):**
```bash
#!/bin/bash
# 客户端进程向管道写入数据
echo "Hello World! This is a test message." > pipe_data
# 指定写入次数,这里写5次
for ((i=0; i<5; i++)); do
echo "Writing message $i..."
echo "Message $i" >> pipe_data
sleep 1 # 延迟以便查看每条消息
done
# 等待server进程退出
wait $(pgrep server)
echo "Server has exited."
```
在client进程中,首先将一条消息写入到`pipe_data`,然后循环写入指定次数的数据,最后等待server进程结束。
运行这个程序时,先启动server再启动client,server会开始接收来自client的消息,直到用户选择退出。
阅读全文