一、管道(先进先出)
1、创建管道
#include <unistd.h> int pipe(int filed[2])
filed[0]是以读方式打开,filed[1]是以写方式打开
在同一个进程中使用管道是没有意义的,一般在创建管道后进程要调用fork,然后在父进程和子进程间进行通信。
管道中的数据容量是有限制的,/usr/include/linux/limits.h
PIPE_BUF = 4096
表明任一时刻管道中的数据量不能超过4096字节, 否则write会堵塞和直接返回0
例)
二、使用管道的基本套路
1、创建管道;
2、调用fork,创建子进程;
3、在子进程中把管道文件描述符复制到标准输入或输出文件号,并关闭多余的文件描述符;
4、子进程exec其他应用程序
5、父进程也关闭一个多余的管道文件描述符;
6、父子进程读写管道;
7、父进程等待子进程终止。
三、可以使用popen代劳二的工作
#include <stdio.h>
FILE * popen(const char * cmdstring, const char *type);
#include <stdio.h>
int pclose(FILE *fp);
四、流管道(全双工管道), 可惜linux系统不支持
五、FIFO(命名管道)
两者之间的通信只要认可一个文件名既可,而不需要有集成关系
1、创建
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
2、打开
fopen("filename", "mode");
例)
六、System V IPC
消息队列、信号量、共享内存