环境: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:根据传智播客视频学习整理得出。