匿名管道 Linux
管道
首先自己要用用户层缓冲区,还得把用户层缓冲区拷贝到管道里,(从键盘里输入数据到用户层缓冲区里面),然后用户层缓冲区通过系统调用(write)写到管道里,然后再通过read系统调用,被对方(读端)读取,就要从管道拷贝到读端,然后再显示到显示器上。
pipe创建一个管道
pipe的介绍
1完成这件事:
看图分析
运行结果
#include
#include
using namespace std;
int main()
{
//创建管道
//先创建一个pipefd数组
int pipefd[2];
//用n接受一下,判断是否成功
int n = pipe(pipefd);
if(n<0) return 1;//创建失败了
//创建成功
//测试一下文件描述符是3和4
cout<<"pipefd[0]:"<
2完成这件事:
创建一个子进程
pid_t id = fork();
if(id < 0)return 2;//创建失败
if(id == 0)//创建成功
{
//子进程
}
//父进程
让子进程写入,父进程读取
要想让子进程进程写,就需要在进程中关闭读端
if(id == 0)//创建成功
{
//子进程
close(pipefd[0]);
}
同理
//父进程
close(pipefd[1]);
都用完结束后,可以都关掉
if(id == 0)//创建成功
{
//子进程
close(pipefd[0]);
//.....
close(pipefd[1]);
}
//父进程
close(pipefd[1]);
//.....
close(pipefd[0]);
IPC code,写通信代码
3这件事也完成了:
结构就有了
然后在pipefd[1]这个管道里写,定义一个Writer函数
if(id == 0)//创建成功
{
//子进程
close(pipefd[0]);
//.....IPC code,写通信代码
//在pipefd[1]这个管道里写
Writer(pipefd[1]);
close(pipefd[1]);
exit(0);//正常退出
}
同理父进程的
//父进程
close(pipefd[1]);
//.....IPC code,写通信代码
//在pipefd[0]这个管道里写
Reader(pipefd[0]);
close(pipefd[0]);
//子进程
void Writer(int wfd)
{
}
//父进程
void Reader(int rfd)
{
}
Writer
//子进程
void Writer(int wfd)
{
string s = "hello,I am child";
pid_t self = getpid();
int number = 0;
char buffer[10];
while(true)
{
buffer[0] = 0;//字符串清空,只是为了提醒阅读代码的人,我把这个数组当字符串了
}
}
用到snprintf
介绍
将s和self和number放进buffer
char buffer[100];
while(true)
{
buffer[0] = 0;//字符串清空,只是为了提醒阅读代码的人,我把这个数组当字符串了
snprintf(buffer,sizeof(buffer),"%s pid:%d
",s.c_str(),self);
cout<< buffer <
用cout打印测试一下,打印成功说明写入buffer成功了
等待进程少不了,子进程exit后需要回收
//父进程
close(pipefd[1]);
//.....IPC code,写通信代码
//在pipefd[0]这个管道里写
Reader(pipefd[0]);
//等待进程缺少不了
pid_t rid = waitpid(id,nullptr,0);
if(rid < 0) return 3;//等待失败了
close(pipefd[0]);
如何把消息发送/写入给父进程
用到了write
用write写入管道(管道也是文件),用strlen,不用+1,不用管 ,因为C语言规定 结尾,和文件没有关系,wfd写入管道