将UNIX管道映射到C++std::cout
Mapping UNIX Pipe to C++ std::cout
我正在研究C++中通信进程的选项。最初的想法是将Unix管道绑定到std::cout,但我可以实现它。当直接使用write(STDOUT_FILENO)进行编写时,我得到了预期的结果。当使用std::cout编写时,我会得到更小的随机输出。
#include <iostream>
#include <unistd.h>
#include <fcntl.h>
const int PIPE_READ = 0;
const int PIPE_WRITE = 1;
int main() {
int pfd[2];
if(pipe(pfd) == -1){
std::cout << "Cannot create pipe" << std::endl;
return 0;
}
int pid = fork();
if(pid == -1){
std::cout << "Error on fork: " << errno << std::endl;
} else if(pid == 0) { // Child process
if(dup2(pfd[PIPE_WRITE],STDOUT_FILENO) < 0) {
std::cout << "Cannot redirect STDOUT: " << errno << std::endl;
return 0;
}
close(pfd[PIPE_WRITE]);
for(int i = 0; i < 8; i++){
int data = i;
write(STDOUT_FILENO,&data,sizeof(int)); // Works
//std::cout << data; // Don't work
}
} else { // Parent process
close(pfd[PIPE_WRITE]);
for(int i = 0; i < 8; i++){
int data;
ssize_t status;
if((status = read(pfd[PIPE_READ],&data,sizeof(int))) != sizeof(int)) {
std::cout << "Error (" << errno << ") on read: " << status << std::endl;
return -1;
}
std::cout << data << std::endl;
}
}
return 0;
}
让我们仔细看看你的写作:
write(STDOUT_FILENO,&data,sizeof(int)); // Works
//std::cout << data; // Don't work
第一个"工作"版本以原始二进制形式将data
的内容写入标准输出。第二个"非工作"版本将data
的值作为文本写入标准输出。
如果data
的值是5
,则write
调用将写入整数值5
,而std::cout << data
将写入整值53
(使用ASCII编码)。
当您将数据读取为父级中的原始二进制int
时,这当然会产生影响。
如果要将原始二进制数据写入std::cout
,则必须使用std::ostream::write
:
std::cout.write(reinterpret_cast<char*>(&data), sizeof data);
上面的行相当于您的write
系统调用。
同样重要的是,以原始形式写入int
将写入sizeof(int)
字节,通常为4个。将一位整数作为文本写入将写入一个字节。
循环将写入8个数字,这意味着如果使用write
,它将写入32个字节(4*8)。如果使用<<
到std::cout
进行输出,则将写入8个字节。读取时,您将读取这8个字节,并将其放入两个单独的int
值中,然后read
调用将返回0
,因为管道已关闭。
这两个int
值的值取决于您的硬件体系结构,无论是小端还是大端。
相关文章:
- std::cout.imbue()多重调用
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- std::cout输出int时出现编译错误
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- main() 中的 std::cout 在调试期间不会在调试控制台中打印任何内容
- std::cout 来自多个线程
- 在 c++ 中以十六进制格式打印无符号字符(BYTE).使用 std::cout
- Cuda 基本程序 (将值写入矩阵和 std:cout 不起作用) ;主功能不启动
- 是否可以为 std::cout 创建别名?
- std::cout 在打印变量与函数表达式时的行为不同
- 带有 std::cout 的多线程控制台文本动画
- 捕获/禁止发送到 std::cout 的 OpenCV 警告
- printf() 和 std::cout 在指针方面的区别
- 使用字符串流加速 std::cout 日志记录
- 是否可以在每次使用std::cout时执行一个函数
- 为什么'std::cout << !+2 '输出 0?
- 如何将自定义类传递给std::cout
- 对于输出,std::copy是否比std::cout快