gpt4 book ai didi

c++ - 将 UNIX 管道映射到 C++ std::cout

转载 作者:行者123 更新时间:2023-11-28 05:20:46 26 4
gpt4 key购买 nike

我正在研究 C++ 中通信进程的选项。从将 Unix 管道绑定(bind)到 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 的值作为文本到标准输出。

如果值为data5然后是 write调用将写入整数值 5同时std::cout << data将写入整数值 53 (使用 ASCII encoding )。

当您以原始和二进制形式读取数据时,这当然会产生影响 int在 parent 中。

如果你想将原始二进制数据写入std::cout你必须使用 std::ostream::write :

std::cout.write(reinterpret_cast<char*>(&data), sizeof data);

上面一行相当于write你有系统调用。


同样重要的是要知道写一个 int原始形式会写sizeof(int)字节,通常是四个。将一位整数作为文本写入将写入一个字节。

您的循环将写入八个数字,这意味着如果使用 write 它将写入 32 个字节 (4 * 8) .如果您使用 << 输出至 std::cout那么你将写入 8 个字节。当您阅读时,您将读取这 8 个字节并将其放入两个单独的 int 中。值,然后是 read调用将返回 0因为管道已经关闭。

这两个值是多少int值将取决于您的硬件架构,如果它是 little-endian or big-endian .

关于c++ - 将 UNIX 管道映射到 C++ std::cout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41547650/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com