无名管道
2015-06-11 20:30
260 查看
管道是UNIX系统IPC的最古老形式,所有的UNIX系统都支持这种通信机制。有两个局限性:
(1) 支持半双工;
(2) 只有具有亲缘关系的进程之间才能使用这种无名管道;
pipe函数
功能:创建无名管道
函数原型:#include <unistd.h>
int pipe(int filedes[2]);
参数经由参数filedes返回两个文件描述符,filedes[0]为读而打开,filedes[1]为写而打开。
经典的管道使用模型
使用管道的注意事项:
1. 当读一个写端已经关闭的管道时,在所有数据被读取之后,read函数返回值为0,以指示到了文件结束处;
2. 如果写一个读端关闭的管道,则产生SIGPIPE信号。如果忽略该信号或者捕捉该信号并处理程序返回,则write返回-1,errno设置为EPIPE
实例
系统调用pipe创建一个管道,子进程想管道里面写
Child process is sending a message
父进程从管道中读出,并显示
#include <stdio.h>
#include <unistd.h>
#define SIZE 128
int pid;
int main(int argc, char *argv[])
{
int fd[2];
char out[SIZE];
char in[SIZE] = “Child process is sending a message”;
pipe(fd); // create a pipe
while((pid = fork()) < 0); //create a child process
if(pid == 0) //in child process
{
close(fd[1]);
read(fd[0], out, SIZE);
fprintf(stdout, “%s\n”, out);
exit(0);
}
else //in parent process
{
close(fd[0]);
write(fd[1], in, SIZE);
sleep(2);
exit(0);
}
return 0;
}
(1) 支持半双工;
(2) 只有具有亲缘关系的进程之间才能使用这种无名管道;
pipe函数
功能:创建无名管道
函数原型:#include <unistd.h>
int pipe(int filedes[2]);
参数经由参数filedes返回两个文件描述符,filedes[0]为读而打开,filedes[1]为写而打开。
经典的管道使用模型
使用管道的注意事项:
1. 当读一个写端已经关闭的管道时,在所有数据被读取之后,read函数返回值为0,以指示到了文件结束处;
2. 如果写一个读端关闭的管道,则产生SIGPIPE信号。如果忽略该信号或者捕捉该信号并处理程序返回,则write返回-1,errno设置为EPIPE
实例
系统调用pipe创建一个管道,子进程想管道里面写
Child process is sending a message
父进程从管道中读出,并显示
#include <stdio.h>
#include <unistd.h>
#define SIZE 128
int pid;
int main(int argc, char *argv[])
{
int fd[2];
char out[SIZE];
char in[SIZE] = “Child process is sending a message”;
pipe(fd); // create a pipe
while((pid = fork()) < 0); //create a child process
if(pid == 0) //in child process
{
close(fd[1]);
read(fd[0], out, SIZE);
fprintf(stdout, “%s\n”, out);
exit(0);
}
else //in parent process
{
close(fd[0]);
write(fd[1], in, SIZE);
sleep(2);
exit(0);
}
return 0;
}
相关文章推荐
- 招一位安防软件工程师,嵌入式开发工程师
- 跟林轩田的机器学习课程
- 自定义控件UITypeEditor
- 构造函数私有化
- 祝福51CTO学院两岁生日
- 有名管道
- Linux的chattr与lsattr命令详解
- PowerDesigner 创建模型及生成带注释sql操作手册
- 写片刻代码用到的音乐播放器
- 用memset函数把数组的内存初始化为零
- do while(0) 的几种用法
- Android内核开发:如何统计系统的启动时间
- Android内核开发:如何统计系统的启动时间
- 安装wamp后,127.0.0.1可以访问,localhost不能访问
- 拦截电话---> 关于利用反射 调用系统 hiden的 方法
- 析构函数
- 小白在学云计算—GFS
- 几种进程间的通信方式
- 迷宫问题——堆栈应用(C++版)
- Climbing Stairs