Как создать подпроцесс создания с ФАЙЛом * как его стандартный ввод, стандартный вывод или стандартный вывод? - PullRequest
0 голосов
/ 10 ноября 2019

Если есть серия указателей FILE, которые указывают на данные FILE («объект»). Я хочу создать subprocess и установить subprocess's stdin stdout and stderr на эти указатели ФАЙЛА. Что я могу сделать?

Если такой функции нет, я могу ее создать, но не знаю, как.

Если это необходимо, доступ к члену FILE также разрешен. .

Существуют некоторые заголовки, предоставляемые стандартной библиотекой C, такие как m, но они поддерживают только перенаправление ввода-вывода с файловым дескриптором.

Единственное, что у меня есть, - ненулевые указатели FILE.

Я бы хотел, чтобы эта функция выполнялась почти так же, как subprocess.run в Python.

int subprocess_run(char *filename, char **args, FILE *std_in, FILE *std_out, FILE *stderr);

1 Ответ

1 голос
/ 10 ноября 2019

Два варианта: либо с использованием традиционного fork (), либо с использованием нового 'spawn'

Используя fork

int subprocess_run(char *filename, char **args, FILE *std_in, FILE *std_out, FILE *std_err);

   fflush(std_out) ;
   fflush(std_err) ;
   pid_t pid = fork() ;

   if ( !pid ) {
      // Child process, setup files, exec program, ...

      dup2(fileno(std_in)), STDIN_FILENO) ;
      dup2(fileno(std_out)), STDOUT_FILENO) ;
      dup2(fileno(std_err)), STDERR_FILENO) ;
      execvp(filename, args) ;
      perror("exevcp failed") ;

   } else if ( pid == -1 ) {
       // Error
       ...
   } else {
       // Parent
       ...
   } ;
}

Обратите внимание, что 'args'должен включать имена программ как argv [0], в соответствии с требованиями execvp. В противном случае вам придется создать новый массив.

Использование posix_spawn

Posix_spawn предоставляет интерфейс для достижения того же, что и выше, но требует значительно более сложныхНастройка (для проблемы, описанной здесь). Это обеспечивает незначительное преимущество для определенной системы, поскольку может снизить накладные расходы на разветвление. При необходимости посмотрите на man posix_spawn.

...