LinuxC/C++编程(4)—管道通信

管道是Linux为进程提供的一种通信方式,这里所说的管道只能用于有血缘关系的进程(一般是子进程和父进程之间)。一般用来做进程同步和进程间通信。


Linux中提供的有名管道的建立函数为:int pipe(int pipe[2]);

pipe(建立管道):
1) 头文件 #include<unistd.h>
2) 定义函数: int pipe(int filedes[2]);
3) 函数说明: pipe()会建立管道,并将文件描述词由参数filedes数组返回。
              filedes[0]为管道里的读取端
              filedes[1]则为管道的写入端。
4) 返回值:  若成功则返回零,否则返回-1,错误原因存于errno中。

    错误代码:
         EMFILE 进程已用完文件描述词最大量
         ENFILE 系统已无文件描述词可用。
         EFAULT 参数 filedes 数组地址不合法。*/

对于管道的读写都是直接通过读写文件描述符filedes完成。且默认阻塞,即管道数据满的时候写操作被阻塞,数据空的时候读操作被阻塞。


下面贴一段简单的代码:

#include <iostream>
#include <unistd.h>
#include <sys/wait.h>
using namespace std;

int main()
{
	int pipefd[2];
	pipe(pipefd); //包含于<unistd.h>,定义了一个管道,同时也打开了参数的文件描述符
	pid_t pid = fork();
	if (pid < 0)
	{
		cerr << "fork error!" << endl;
		return -1;
	}
	else if (pid > 0)
	{
		cout << "I'm the parent process! Now write to the pipe!" << endl;
		close(pipefd[0]);//关闭管道的读取端
		char sendMsg[100] = "heiheihei";//这是要传递的信息
		write(pipefd[1], sendMsg, 100);//将信息写入管道
		close(pipefd[1]);//写完之后关闭写入端
	}
	else if (pid == 0)
	{
		cout << "I'm the child process!";
		close(pipefd[1]);//过程和写入是类似的
		char receiveMsg[100];
		read(pipefd[0], receiveMsg, 100);//如果管道为空,这个函数默认被阻塞
		close(pipefd[0]);
		cout << "Now I've recerive the message:" << receiveMsg << endl;
	}

	waitpid(pid, NULL ,0); //包含于<sys/wait.h>,等待子进程结束并清理其资源
	return 0;
}

控制台的输出结果如下:父进程发送的字符串在子进程中打印了:

I'm the parent process! Now write to the pipe!
I'm the child process! Now I've recerive the message:heiheihei


如果要设置管道为非阻塞模式,可以通过下面两个函数实现:

        fcntl(filedes[0], F_SETFL, O_NONBLOCK);
        fcntl(filedes[1], F_SETFL, O_NONBLOCK);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值