C++: Почему `assert(pipe(stdin_fd) == 0)` устанавливает дескрипторы файлов в ноль? [дубликат]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 C++: Почему `assert(pipe(stdin_fd) == 0)` устанавливает дескрипторы файлов в ноль? [дубликат]

Сообщение Anonymous »

Я пишу код C++ для межпроцессного взаимодействия, где я создаю каналы для обмена данными между родительским и дочерним (созданным с помощью fork()) процессами.
Я объявляю дескрипторы файлов для настройки каналов как,

Код: Выделить всё

int stdin_fd[2];
int stdout_fd[2];
Затем я вызываю Pipe(stdin_fd)[1] из unistd.h для инициализации файловых дескрипторов. В документации говорится[1], Pipe() возвращает 0 в случае успеха и -1 в случае ошибки. Итак, у меня есть операторы Assert[2], чтобы убедиться, что вызовы Pipe() успешны:

Код: Выделить всё

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;
}
Итак, мой вопрос в том, почему Assert(pipe(stdin_fd) == 0); и Assert(pipe(stdout_fd) == 0); устанавливают все файловые дескрипторы обнуляются?
[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);
Теперь я понимаю, что даже в Python было бы плохо смешивать функциональный код с утверждениями, поскольку теоретически можно отключить утверждения и в Python, однако на практике это не распространено.

Подробнее здесь: https://stackoverflow.com/questions/787 ... rs-to-zero
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Я получаю ошибку CS0104 'Assert' - неоднозначная ссылка между nUnit.framework.assert 'и' microsoft.visualstudio.testtool
    Anonymous » » в форуме C#
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Я получаю ошибку CS0104 'Assert' - неоднозначная ссылка между nUnit.framework.assert 'и' microsoft.visualstudio.testtool
    Anonymous » » в форуме C#
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Arangodb: дескрипторы файлов недоступны.
    Anonymous » » в форуме Linux
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Дескрипторы файлов 3-5 в Linux
    Anonymous » » в форуме Linux
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous
  • Дескрипторы открытых файлов Java для каталогов
    Anonymous » » в форуме JAVA
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»