进程之间通讯方式:管道 信号量 消息队列 共享内存 socket(网络,用于不同主机间通讯)
多进程编程能同时完成多个任务
多进程工作时,进程之间需要通讯(传递信息)
ps:fork创建的子进程,与父进程之间唯一共享的是文件描述符(fd)
进程间通信——管道 :半双工通讯 ==> 同一时刻、数据流向是单向的
1.有名管道(命令管道):在磁盘上会存储一个管道文件标识(inode),但是并不会占据磁盘空间(block),数据不会存储到磁盘上。 存于内存 限制:同一台主机上同一个系统有权限操作管道文件的任意进程都可以通过其完成进程间通信。
2.无名管道:无名管道不存在管道文件、其借助于父子进程共享fork之前打开的文件描述符 限制:只能应用于父子进程
数据缓存在内存中
3.管道的使用:
(1) . 有名管道的使用
创建管道文件:命令 mkfifo 文件名 函数 int mkfifo(const char *pathname,int node)
(2) . 无名管道的使用
创建并且打开无名管道: int pipe (int fds[2])
【习题】:
(1). 【有名管道】A进程接收用户输入,B进程统计用户输入的字节数,并打印
首先创建管道文件:mkfifo FIFO
vim maina.c
vim mainb.c
运行结果:
(2). 【无名管道】A进程接收用户输入,B进程统计用户输入的字节数,并打印
首先创建管道文件:mkfifo FIFO
vim mainc.c
运行结果: