Linux下的无名管道

环境:Vmware Workstation;CentOS-6.4-x86_64

说明:

1、对于一个管道而言,在同一端要么只能读,要么只能写,不可能同时具有读写功能。

2、无名管道只能在相关的、有共同祖先的进程间使用(如父子进程,两个不相干的进程之间不能使用无名管道)。

3、读写管道与读写普通文件方式一样,调用write与read函数即可。

4、int pipe(int pipefd[2]);
函数的作用:创建一个无名管道。
函数的返回值:返回值为0代表创建管道成功;返回值为-1表示创建管道失败。
函数的参数:参数是一个数组,用来存储文件的描述符。数组中的第一个元素是用来读取数据,第二个参数使用用来写入数据。

5、int close(int fd);
函数返回值:返回0表示文件关闭成功,返回-1表示文件关闭失败。
函数的参数:参数是文件描述符。

程序:

使用无名管道实现,在子进程中写内容,在父进程中读取内容。

步骤:

1、创建并编辑makefile文件:

.SUFFIXES:.c .o

CC=gcc

SRCS=main.c
OBJS=$(SRCS:.c=.o)
EXEC=main

start: $(OBJS)
	$(CC) -o $(EXEC) $(OBJS)
	@echo "-----------------------------OK-----------------------"

.c.o:
	$(CC) -Wall -o $@ -c $<

clean:
	rm -rf $(EXEC) $(OBJS)
2、创建并编写源文件main.c:

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>

int main(void)
{
	// 创建一个int类型的数组,存储的是文件描述符
	// 第一个元素是读取数据,第二个元素是写入数据
	int fd[2];
	
	// 打开无名管道,成功继续执行,不成功退出函数
	if (pipe(fd) == -1)
	{
		printf("create nonamefifo failed : %s\n", strerror(errno));
	}
	// 创建字符数组,作为读写文件的缓冲区
	char buf[1024];
	// fork程序,并获取返回值
	pid_t pid = fork();
	if (pid == -1)
	{
		printf("fork failed : %s\n", strerror(errno));
	}
	
	// 判断是子进程还是父进程
	if (pid > 0)
	{
		// 清空缓冲区内存
		memset(buf, 0, sizeof(buf));
		// 通过文件描述符读取管道中的数据
		read(fd[0], buf, sizeof(buf));
		// 得到读取到的内容并输出
		printf("%s", buf);
		// 关闭读取数据端的管道
		close(fd[0]);
	}
	else
	{
		// 清空缓冲区内存
		memset(buf, 0, sizeof(buf));
		// 拷贝字符串到buf中
		strcpy(buf, "hello world\n");
		// 通过文件描述符把内容写入到管道中
		write(fd[1], buf, strlen(buf));
		// 关闭写数据端的管道
		close(fd[1]);
	}
	
	return 0;
}
3、编译并执行程序:

[negivup@negivup mycode]$ make
gcc -Wall -o main.o -c main.c
gcc -o main main.o
-----------------------------OK-----------------------
[negivup@negivup mycode]$ main
hello world

可以看出,通过无名管道,实现了两个进程之间的通信。


PS:根据传智播客视频学习整理得出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值