Я работал над тем, чтобы найти способ решить проблему в большой кодовой базе. Я должен был добавить функциональность.

Существовала функция stdout_to_string в xapian-application/omega

std::string stdout_to_string(const std::string &cmd, bool use_shell, int alt_status = 0);

Эта функция внутренне пытается запустить команду в среде Linux и отправить результат вызывающей программе. Внутренне на платформе Linux, которая поддерживает socketpair и fork.

  1. создать пару сокетов, которая соединит дочерний и родительский процессы
  2. Он пытается сделать fork.
  3. Реализовать выполнение команды в дочернем.
  4. Прочитайте родительский fd, полученный с помощью socketpair, прочитайте вывод из дочернего элемента и вернитесь к вызывающей функции.

Мы хотели реализовать версию, в которой мы можем создать несколько дочерних процессов, а затем выбрать их. Итак, идея заключалась в том, чтобы не выполнять ожидание и чтение из части fd в родительском, а скорее возвращать fd и дочерний pid вызывающей функции для их обработки.

Поскольку мы не хотим менять сигнатуру этой функции, мы не можем изменить возвращаемое значение и, более того, поскольку оно уже используется во многих местах в кодовой базе, мы не можем даже изменить сигнатуру таким образом, чтобы текущий вызов функции не будет работать.

Приведенное выше предложение в основном сводится к следующему:

  • Передайте дополнительный аргумент, в котором будут храниться значения fd и pid, которые можно будет прочитать.
  • аргумент должен иметь значение по умолчанию, чтобы текущие вызовы функций работали как есть.
  • Должна быть возможность изменить аргумент, который должен хранить значение.
  • Должна быть настраиваемая структура, чтобы хранить более 1 значения.

В комнате слон

Невозможно иметь структуру со ссылочным значением, которое должно иметь значение по умолчанию разумным и простым способом.



Поскольку это структура по ссылке, она не может быть временной переменной. Следовательно, мы не можем сделать

stdout_to_string(…,ProcessData & process = ProcessData(false));

У нас не могло быть глобальной переменной, так как это плохо в базе кода, и, кроме того, я получал множественное объявление

Мы можем иметь NULL в качестве значения по умолчанию, поскольку NULL . Поскольку он выдавал ошибку, это долго и не может быть назначено структуре.

После проб и ошибок, а также перепробовав множество вещей, я, наконец, попытался использовать указатель и передал NULL в качестве значения по умолчанию, поскольку это разрешено для указателя.

string
stdout_to_string(const string &cmd, bool use_shell, int alt_status, ProcessData * p_data)
{

Решение сработало!!! Но не стоит использовать указатель, если можно этого избежать.

Есть ли способ, я могу избежать использования указателя в этом случае??