1 . mkfifo ( read write ,open) 利用mkfifo 建立 管道 ,利用 open()协定管道两边的 读写人员
open()管道时 ,open是阻塞的,只有当read ,write 遇到时再继续进行,open管道的顺序涉及死锁;
fd_read=open(argv[1] ,O_RDONLY ) fd_write=open( argv[1] ,O_WRONLY ) 分别分配给2个进程
一根管道是单向的
2. select ( ) 使用 select 时 是非阻塞的 , 利用了 bit_map方面思想 select 很重要!!!!
3 . 客户端 服务器 传输信息 select mkfifo sscanf sprintf continue
(1) 先由服务器 创建一条管道, 这条管道用于 服务器 得到 客户端的信息,服务器读,客户端写,这条管道一个服务器读,可多个客户端写; (这里 定义为 主管道 ,方便下面理解) ,客户端通过主管道,将上线,下线,传递信息等 发送给服务器,由服务器再转发。主管道主要为服务器接收消息。
(2) 进入一个新客户端 时,新的客户端通过主管道 向服务器 发送建立信息(建立 此客户端和服务器管道,这里可通过进程ID 唯一,利用 pid.fifo 命名管道名字),客户端建立 mkfifo -> pid.fifo , 客户端将pid传给 服务器,服务器方也建立与 pid.fifo 管道间的联系, pid.fifo管道 服务器写,客户端收。服务器通过pid.fifo 转发 信息。
(3) 消息方面 上线: 客户端( on+pid ) 发送给 服务器 ,strncmp 服务器 对比 “on” 相同则知道是上线消息, open() 管道 pid.fifo ,
下线 客户端(off +pid ) 服务器关闭 相连的管道 ,客户端 unlink 删除 pid.fifo管道
发送消息 遍历 客户端结构体数组, 给在的客户端 转发 消息 write read
(4) 当 read() -》读主管道 返回0时表示当前没有 客户端连线