读书笔记之linux/unix系统编程手册(44)
2015-08-25 19:30
676 查看
管道和FIFO
1.管道是一个字节流意味着在使用管道时是不存在消息或消息边界的,从管道中读取数据的进程可以读取任意大小的数据块,而不管进程写入的数据块大小,如果需要实现离散消息的概念,最好使用其他的IPC机制如消息机制和数据报socket
2.管道是单向的
3.可以确保写入不超过pipe_buf字节的操作是原子的,只有在数据被传输到管道时候,pipe_buf限制才起作用,当写入的数据达到pipe_buf时,write()会在必要的时候阻塞直到管道可用空间可以完成原子操作
4.管道是一个在内核内存中的维护的缓冲器,这个缓冲器的存储能力是有限的。一旦管道被填满后,后续向该管道的写入操作就会被阻塞直到从管道中移除了一些数据为止
6.mode指定了权限,一旦FIFO被创建,任何进程都能够打开它,只要它能够通过常规的文件检测
7.打开一个FIFO会同步读取进程和写入进程
8.无法使用单个FIFO向所有客户端发送响应,因为会形成竞争关系
1.管道是一个字节流意味着在使用管道时是不存在消息或消息边界的,从管道中读取数据的进程可以读取任意大小的数据块,而不管进程写入的数据块大小,如果需要实现离散消息的概念,最好使用其他的IPC机制如消息机制和数据报socket
2.管道是单向的
3.可以确保写入不超过pipe_buf字节的操作是原子的,只有在数据被传输到管道时候,pipe_buf限制才起作用,当写入的数据达到pipe_buf时,write()会在必要的时候阻塞直到管道可用空间可以完成原子操作
4.管道是一个在内核内存中的维护的缓冲器,这个缓冲器的存储能力是有限的。一旦管道被填满后,后续向该管道的写入操作就会被阻塞直到从管道中移除了一些数据为止
int main(int argc, char* argv[]) { int fields[2]; char buf[MAX_SIZE]; if(pipe(fields) == -1) { perror("pipe"); } //printf("hello world\n"); int pid = fork(); if(pid == -1) { perror("fork"); }else if(pid > 0) { if(close(fields[0]) == -1) { perror("close"); } while(memset(buf, MAX_SIZE, 0) && gets(buf)) { write(fields[1], buf, MAX_SIZE); } if(close(fields[1]) == -1) { perror("close"); } }else { if(close(fields[1]) == -1) { perror("close"); } while(1) { read(fields[0], buf, MAX_SIZE); printf("%s\n", buf); memset(buf, MAX_SIZE, 0); } if(close(fields[0]) == -1) { perror("close"); } } //both parent and children do below return 0; }
#include <signal.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/stat.h> #include <string.h> #include <fcntl.h> #define MAX_SIZE 1024 #define FIFO "./fifo" int main(int argc, char* argv[]) { char buf[1024]; if(mkfifo(FIFO, 0777) == -1) { perror("fifo"); exit(1); } int pid = fork(); if(pid == -1) { perror("fork"); exit(1); } if(pid == 0) { int wr = open(FIFO, O_WRONLY); if(wr == -1) { perror("wr"); exit(1); } while(memset(buf, 1024, 0) && gets(buf)) { write(wr, buf, sizeof(buf)); } }else { int rd = open(FIFO, O_RDONLY); if(rd == -1) { perror("rd"); exit(1); } while(1) { memset(buf, 1024, 0); read(rd, buf, sizeof(buf)); printf("%s\n", buf); } } return 0; }5.FIFO与管道,他们两者之间最大的差别在于FIFO在文件系统中拥有一个名称并且其打开方式与打开一个普通文件一样的,也称为命名管道
6.mode指定了权限,一旦FIFO被创建,任何进程都能够打开它,只要它能够通过常规的文件检测
7.打开一个FIFO会同步读取进程和写入进程
8.无法使用单个FIFO向所有客户端发送响应,因为会形成竞争关系
相关文章推荐
- Linux系统下设置交换文件(swapfie)一提升性能。
- Linux系统基础优化脚本--安装完操作系统必做的操作
- 文件系统管理
- Vm+linux挂载U盘和SD卡的说明
- linux权限和ntfs知识文件系统权限
- linux之eventfd()
- Linux操作系统日志中常用的搜索关键字
- Linux centOS下修复“运行aclocal失败:没有该文件或目录”
- Linux学习笔记
- linux简单命令的使用
- yum-Couldn't resolve host 'mirrorlist.centos.org'
- CentOS关闭休眠和屏保模式
- CentOS7安装Zabbix
- Linux进程间通信 共享内存+信号量+简单例子
- linux 自动登录脚本
- Linux下查看/管理当前登录用户及用户操作历史记录
- 开发笔记-Linux-MySQL
- linux如何安装jdk
- linux多进程通信
- 修改linux最大文件句柄数