大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说linux 匿名管道_多进程间通信,希望您对编程的造诣更进一步.
概念
管道,是一种把两个进程之间的标准输入和输出连接的起来的一种通信机制,它是单向数据流,一个进程写入管道的所有数据都由内核定向到另一个进程中,另一个进程就可以从管道中读取数据。
管道可以分为匿名管道和命名管道。通常所说的管道是匿名管道,除非指明命名管道。
在Linux系统中,管道比较常用,如 ls -l | grep string 就使用了管道技术。
特点
- 半双工通信的(即数据只能在一个方向上流动),具有固定的读端(fd[0]为读端)和写端(fd[1]为写端)。
- 它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。
- 它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
函数原型
1) 头文件: #include<unistd.h>
2) 定义函数: int pipe(int filedes[2]);
3) 函数说明: pipe()会创建管道,并将文件描写叙述词由參数filedes数组返回。
filedes[0]为管道的读取端
filedes[1为管道的写入端。
4) 返回值: 若成功则返回零,否则返回-1,错误原因存于errno中。
原理
匿名管道,用于具有亲缘关系的进程间通信,即父子进程间通信。
1、首先,在主进程(父进程)中创建匿名管道,
2、然后,在主进程调用fork创建子进程,这时父子进程同时拥有了管道返回的文件描述符。
3、在父进程(fork 返回值大于0)中,关闭读端(fd[0]),写数据到写端(fd[1]),或者关闭写端 (fd[1]),从读端(fd[0])阻塞读取数据
4、在子进程(fork返回值==0)中,关闭写端(fd[1]),从读端(fd[0])阻塞读取数据,或者关闭读端 (fd[0]),写数据到写端(fd[1])。
代码示例
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main( int agrc, char **argv )
{
int fds[2]; /* fds[0]read */
pid_t pid;
int ret = pipe( fds );
if ( ret < 0 )
{
printf( "create pipe error\n" );
exit( -1 );
}
ret = fork();
if ( ret < 0 )
{
printf( "fork error!\n" );
exit( -1 );
}
else if ( ret > 0 ) /* 父进程 */
{
/* 关闭读端 */
close( fds[0] );
/* 写数据 */
char data[] = "hello world\n";
write( fds[1], data, strlen( data ) + 1 );
}else { /* 子进程 */
/* 关闭写 */
close( fds[1] );
char buff[20] = { 0 };
/* 读数据 */
read( fds[0], buff, 20 );
printf( "child fork read:%s", buff );
}
return(0);
}
总结
1、匿名管道适用于具有亲缘关系的进程间通信。
2、匿名管道是数据是流向是单向的,进程在写数据时要关闭读端(fd[0]),在读数据是要关闭写端(fd[1])
3、fork 函数返回值大于0,处理父进程逻辑;等于0 ,处理子进程逻辑;小于0创建进程错误。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/11692.html