栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

多进程编程(二):管道

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多进程编程(二):管道

进程间通信(InterProcess Communication,IPC)

主要通信方式:

  • 管道
    1、匿名管道(pipe)
    2、有名管道(FIFO)
  • 消息队列
  • 共享内存
  • 信号量
  • 信号
  • 套接字(Socket)
管道 匿名管道

前一章提到了一个shell命令:ps -ef | grep demo,
这里的 | 其实就是一个管道,shell创建了两个进程来分别执行 ps -ef 和 grep demo,并将前一个的输出,作为输入给到第二个。

特点:
1、管道是一个在内核内存中维护的缓冲区,这个缓冲区的存储能力是有限的,不同操作系统的大小不一定相同(Linux64位系统下其大小是4k),可以使用shell命令:ulimit -a查看
2、管道拥有文件的特质:读操作、写操作,但是没有文件实体。
3、管道只能承载无格式字节流以及缓冲区大小受限
4、通过管道传递的数据是顺序的,读取与写入的顺序保持一致
5、传递是单向的,如果想要双向通信,就要创建两个管道,也就是要么父进程写入,子进程读取;要么父进程读取,子进程写入
6、只能在具有公共祖先的进程之间使用(父子进程,兄弟进程,具有亲缘关系的进程)

函数

#include 
int pipe(int pipefd[2]);
- pipefd[0] : 管道读取端
- pipefd[1] : 管道写入端
- 返回值:
	创建成功返回 0
	创建失败返回 -1

举例:

#include 
#include 
#include 
#include 
#include 

int main() {

	// 创建管道
	int pipe_fd[2] = {0};
	int res_p = pipe(pipe_fd);
	if (res_p == 0) {
		printf("pipe create successn");
	} else {
		perror("pipe");
	}

	// 创建子进程
	pid_t res = fork();

	// 父进程写入数据
	if (res > 0) 
	{	
		close(pipe_fd[0]); // 关闭读取端
		printf("Parent: n");
		char buf_w[] = "Hello, world";
		write(pipe_fd[1], buf_w, strlen(buf_w));
	} 
	else if (res == 0)  // 子进程读取数据
	{
		close(pipe_fd[1]); // 关闭写入端
		printf("Child: n");
		char buf_r[100];
		read(pipe_fd[0], buf_r, 100);
		printf("%sn", buf_r);
	} 
	else 
	{
		perror("fork");
	}

	return 0;
}
有名管道

匿名管道只能用于具有亲缘关系的进程间通信。为了客服这个缺点,提出了有名管道(FIFO)。
有名管道(FIFO)不同于匿名管道之处在于它提供了一个路径名与之关联,以FIFO的文件形式存于文件系统中,并且其打开方式与打开一个普通文件是一样的,这样即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够通过FIFO相互通信。

函数:

#include 
#include 
int mkfifo(const char *pathname, mode_t mode);
- pathname: FIFO文件的路径 或者是 想要保存的路径
- mode: 权限
- 返回值:
	成功:0
	失败:-1

一旦创建了FIFO,就可以使用 open 打开它,常见的 I/O 函数都可用于 FIFO

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/993306.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号