Я изучаю параметры процессов связи на C++. Началось с идеи связать трубу Unix с std :: cout, но я мог заставить ее работать. При записи напрямую с использованием записи (STDOUT_FILENO) я получаю ожидаемый результат. При записи с использованием std :: cout я получаю меньший и случайный вывод.Сопоставление UNIX Pipe с C++ 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;
}
Маленькая ошибка :). Мое предположение заключалось в том, что cout может выводить как строковые, так и двоичные данные в зависимости от типа данных. Еще одно: изменение файловых дескрипторов не было отражено в объекте std :: cout C++. Благодарю. – Zayl