Я объявляю дескрипторы файлов для настройки каналов как,
Код: Выделить всё
int stdin_fd[2];
int stdout_fd[2];
Код: Выделить всё
assert(pipe(stdin_fd) == 0);
assert(pipe(stdout_fd) == 0);
Методом проб и ошибок я понял, что когда я удаляю операторы утверждения и вместо этого добавляю проверки, как показано ниже, Я получаю правильное поведение (положительные дескрипторы файлов):
Код: Выделить всё
if (pipe(stdin_fd) == -1 || pipe(stdout_fd) == -1) {
perror("Error creating pipes");
return 1;
}
[1] - https://man7.org/linux/man-pages/man3/pipe.3p.html
[ 2] - https://en.cppreference.com/w/cpp/error/assert
ОБНОВЛЕНИЕ:
Спасибо за советы в комментариях и отрицательных голосах. Я программист на Python, пытающийся удачи с C/C++. В Python было обычным (возможно, обычным) добавлять такие операторы: Assert Pipe(stdin_fd) == 0
Я обжегся, проделав то же самое с C++.
Для будущих посетителей хороший совет в этом комментарии: "НИКОГДА не помещайте функциональный код в оператор утверждения".
Возможно, мне следовало разделить функционал код из утверждает это,
Код: Выделить всё
// these will always run
auto code1 = pipe(stdin_fd);
auto code2 = pipe(stdout_fd);
// these may not run when asserts are disabled
assert(code1==0);
assert(code2==0);
Подробнее здесь: https://stackoverflow.com/questions/787 ... rs-to-zero