Linux笔记--无名管道Pipe通信

管道

无名管道可以用来给父进程以及子进程之间通信,使用十分方便。

函数

//pipe创建管道,fd为一个int类型数组,fd[0]用来读,fd[1]用来写
pipe(fd);

//将字符串buf写入管道fd,成功则返回0,否则返回-1
write(fd[1], buf, strlen(buf));

//将管道fd的数据读出到buf,成功则返回0,否则返回-1
read(fd[0], buf, sizeof(buf));

//关闭端口,fd关闭管道,fd[0]读端口,fd[1]写端口
close(fd[]);

举例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>


int main()
{
	int fd[2];
	int ret;
	pid_t pid;

	ret = pipe(fd);	//创建管道
	if (-1 == ret)
	{
		perror("pipe");
		exit(1);
	}
	
	pid = fork();
	if(pid == -1)
	{
		perror("fork");
		exit(1);
	}
	else if(pid == 0)  //父进程
	{
        	char readBuf[32] = {0};

		close(fd[1]);//关闭写管道
		ret = read(fd[0],readBuf,sizeof(readBuf));
		if(ret == -1)
		{
			perror("read");
			exit(1);
		}
		printf("read from the child : %s \r\n",readBuf);
		close(fd[0]);//关闭读管道
	}
	else	//子进程
	{
		char writeBuf[32] = {0};

		close(fd[0]);   //关闭读管道
		strcpy(writeBuf, "Hello this is a text");
		ret = write(fd[1],writeBuf,strlen(writeBuf));
		if(ret == -1)
		{
			perror("write");
			exit(1);
		}
		close(fd[1]);//关闭写管道
		
		int status;	
		wait(&status);
	}
	return 0;
}

注意

使用管道时,记得将不用的管道进行close()关闭操作,防止读写计数不为0造成阻塞,产生程序BUG。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值