linux进程通信之(一):管道
时间:2010-11-03 来源:andyluo324324
为了更好的理解管道,请看下面的程序
#include<unistd.h>
#include<error.h>
#include<stdio.h>
#include<stdlib.h> int main()
{
int pipe_fd[2];
if(pipe(pipe_fd)<0)//创建一无名管道
{
printf("pipe creat \n");
return -1;
}
else
{
printf("pipe create success \n");
}
close(pipe_fd[0]);//关闭管道描述符
close(pipe_fd[1]); }
/*---------------------------------
1.现在linux中使用较多的进程间通信方式有以下几种:
1)管道(pipe)以及有名管道(named pipe):管道可用于具有亲缘关系进程间的
通信,有名管道,除具有管道所具有的功能外,它还允许无亲缘关系进程间的
通信。
2)信号(signal):信号是软件层次上对中断机制的一种模拟,用于通知接受进程
有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说
是一样的。
3)消息队列:消息队列是消息的链接表。它克服了前两种通信方式中信息量有限
的缺点,具有写权限的进程可以向消息队列中按照一定的饿规则添加新消息,对
消息队列有读权限的进程则可以从消息队列中读取消息。
4)共享内存:它使得多个进程可以访问同一块内存空间,不同进程可以及时看到
对方进程中对共享内存中数据的更新。这种通信方式需要依靠某种同步机制,如
互斥锁和信号量等。
5)信号量:主要作为进程间以及同一进程之间的同步手段。
6)套接字(socket):它用于不同机器之间的进程间通信。 2.管道是把一个程序的输出直接连接到另一个程序的输入,这里所说的管道主要指
无名管道,它具有如下特点:
.它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)
.它是一个半双工的通信模式,具有固定的读端和写端。
.管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的read,write等
函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在内存中。 3.管道创建与关闭
1)管道是基于文件描述符的通信方式,它会创建两个文件描述符fds[0]和fds[1],其中
fds[0]固定用于读管道,而fd[1]固定用于写管道,这样就构成了一个半双工的通道。
2)管道关闭时只需将这两个文件描述符关闭即可,而使用普通的close函数逐个关闭
各个文件描述符。
4.创建管道函数
1)所需要的头文件:#include<unistd.h>
2)函数原型:int pipe(int fd[2])
3)函数输入参数
fd[2]:管道的两个文件描述符,之后就可以直接操作这两个文件描述符。
4)函数的返回值
成功:0
出错:-1 5.实验
[root@localhost the_eight_step]# gcc pipe.c -o pipe
[root@localhost the_eight_step]# ./pipe
pipe create success
------------------------------------*/
#include<error.h>
#include<stdio.h>
#include<stdlib.h> int main()
{
int pipe_fd[2];
if(pipe(pipe_fd)<0)//创建一无名管道
{
printf("pipe creat \n");
return -1;
}
else
{
printf("pipe create success \n");
}
close(pipe_fd[0]);//关闭管道描述符
close(pipe_fd[1]); }
/*---------------------------------
1.现在linux中使用较多的进程间通信方式有以下几种:
1)管道(pipe)以及有名管道(named pipe):管道可用于具有亲缘关系进程间的
通信,有名管道,除具有管道所具有的功能外,它还允许无亲缘关系进程间的
通信。
2)信号(signal):信号是软件层次上对中断机制的一种模拟,用于通知接受进程
有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说
是一样的。
3)消息队列:消息队列是消息的链接表。它克服了前两种通信方式中信息量有限
的缺点,具有写权限的进程可以向消息队列中按照一定的饿规则添加新消息,对
消息队列有读权限的进程则可以从消息队列中读取消息。
4)共享内存:它使得多个进程可以访问同一块内存空间,不同进程可以及时看到
对方进程中对共享内存中数据的更新。这种通信方式需要依靠某种同步机制,如
互斥锁和信号量等。
5)信号量:主要作为进程间以及同一进程之间的同步手段。
6)套接字(socket):它用于不同机器之间的进程间通信。 2.管道是把一个程序的输出直接连接到另一个程序的输入,这里所说的管道主要指
无名管道,它具有如下特点:
.它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)
.它是一个半双工的通信模式,具有固定的读端和写端。
.管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的read,write等
函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在内存中。 3.管道创建与关闭
1)管道是基于文件描述符的通信方式,它会创建两个文件描述符fds[0]和fds[1],其中
fds[0]固定用于读管道,而fd[1]固定用于写管道,这样就构成了一个半双工的通道。
2)管道关闭时只需将这两个文件描述符关闭即可,而使用普通的close函数逐个关闭
各个文件描述符。
4.创建管道函数
1)所需要的头文件:#include<unistd.h>
2)函数原型:int pipe(int fd[2])
3)函数输入参数
fd[2]:管道的两个文件描述符,之后就可以直接操作这两个文件描述符。
4)函数的返回值
成功:0
出错:-1 5.实验
[root@localhost the_eight_step]# gcc pipe.c -o pipe
[root@localhost the_eight_step]# ./pipe
pipe create success
------------------------------------*/
相关阅读 更多 +