现在linux的进程间的通信方式有下面几种:管道(pipe)、有名管道(fifo)、信号、消息队列、共享内存、信号量、套接字等。
下面主要就介绍管道:
1、 管道的特点:
①半双工的通信方式
②只能在只有亲缘关系进程间进行通信
2、 相关函数介绍
函数说明:pipe()会建立管道,并将文件描述词由参数pipefd数组返回。
Pipefd[0]为管道里的读端,pipefd[1]为管道里的写端。
返回值: 若成功则返回零,否则返回-1,错误原因存于errno中。
3、 下面我们来测试下管道的大小
-
#include<stdio.h>
-
#include<unistd.h>
-
#include<stdlib.h>
-
-
int main(void)
-
{
-
int fd[2];
-
int count = 0;
-
if( pipe(fd) < 0 )
-
{
-
perror("fail to create pipe");
-
exit(1);
-
}
-
-
while(1)
-
{
-
write(fd[1],"a",sizeof(char));
-
printf("count = %d\n",++count);
-
}
-
-
return 0;
-
}
上面这段代码就是不断给管道的写端写数据,直到缓冲区满了以后就会阻塞。通过测试我们可以发现管道的大小为65536个字节。
4、 管道的一些细节特点的
①只有管道的读端存在时,才能向管道写入数据。否则向管道写入数据,进程会收到内核传来的SIGPIPE信号(该信号的默认动作是程序终止)。
下面通过例子来说明这一点。
-
#include<stdio.h>
-
#include<unistd.h>
-
#include<stdlib.h>
-
#include<signal.h>
-
-
void handler(int signum)/*信号处理函数*/
-
{
-
printf("rev SIGPIPE\n");
-
}
-
-
int main(void)
-
{
-
int fd[2];
-
int count = 0;
-
-
signal(SIGPIPE,handler);
-
-
if( pipe(fd) < 0 )
-
{
-
perror("fail to create pipe");
-
exit(1);
-
}
-
-
close(fd[0]);
-
write(fd[1],"a",sizeof(char));
-
-
return 0;
-
}
编译执行后:
5、 父子进程间的通信
-
#include<stdio.h>
-
#include<stdlib.h>
-
#include<unistd.h>
-
-
int main(void)
-
{
-
int fd[2];
-
int pid;
-
if( pipe(fd) < 0 )
-
{
-
perror("fail to pipe");
-
exit(1);
-
}
-
-
if( (pid = fork()) < 0 )
-
{
-
perror("fail to fork");
-
exit(1);
-
}
-
else if(0 == pid) /*child*/
-
{
-
close(fd[1]);
-
int read_data;
-
char buf[10];
-
read_data = read(fd[0],buf,sizeof(buf));
-
printf("read_data=%d\n",read_data);
-
printf("buf:%s\n",buf);
-
}
-
else /*parent*/
-
{
-
close(fd[0]);
-
write(fd[1],"hello",sizeof("hello"));
-
close(fd[1]);
-
}
-
-
return 0;
-
}
执行结果为:
写此文章就是为了巩固以前学的一些知识,也参考了些文章。http://blog.chinaunix.net/uid-26833883-id-3227144.html
阅读(1449) | 评论(0) | 转发(0) |