开发者学堂课程【物联网开发- Linux 高级程序设计全套视频:命名管道聊天思路】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/660/detail/11042
命名管道聊天思路
题目:实现单机聊天程序
使用多进程实现多任务,通过命名管道实现进程间通信,实现聊天程序
演示效果
提示:
peter可以连续发 lucy可以连续收 收到后打印对方的名字,对方的消息,每个人有两个进程,两个任务,一个进程负责收消息,收到后打印对方的名字,对方的消息,另外一个任务负责从键盘获取字符串给对方发消息。
原理:
Lucy 有个进程专门发消息,通过 L_P 管道,peter 有个进程专门负责收。
Peter 有个进程专门发消息,Lucy 有个进程专门负责收。两根命名管道。
过程:
无论 peter 还是 lucy 框架过程都是这样,首先创建两个管道接下来打开管道,创建管道,打开管道,创建进程,在子进程打印提示符,从键盘获取字符串,向管道里写数据,read 消息,如果是 lucy 从 peter to lucy 去读,读到后打印对方的名字对方的消息,再将自己的名字打印出来, 因为覆盖了。
收到消息后打印注意
Printf(“\rpeter:%s\n”,recv_buf);
Printf(“lucy:”);
Fflush(stdout);
如果是 lucy
Lucy:
Fd_w=open(“lucy_to_peter”,O_WRONLY);
Fd_r=open(“peter_to_lucy”,O_WRONLY);
如果是peter
Peter:
Fd_w=open(“peter_to_lucy”,O_WRONLY);
Fd_r=open(“lucy_to_peter”,O_WRONLY);
他们都堵塞第一个 open,都等待对方以只读方式打开管道,peter 第一个 open 在等lucy第二个 open,形成死锁。
’将两个调换位置,一个以只写一个以只读,两个进程,以不同方式打开同一管道,同样方式打开第二个管道,防止死锁,打开命名管道注意顺序
Peter:
Fd_r=open(“lucy_to_peter”,O_WRONLY);
Fd_w=open(“peter_to_lucy”,O_WRONLY);
父进程创建子进程,实现多任务。
父进程负责发信息(向 FIFO 里写数据),子进程负责接收信息(从 FIFO 里读数据)打开命名管道的用阻塞的方法打开。




