Что происходит с дескрипторами файлов после вызова execv?(C ++) - PullRequest
0 голосов
/ 28 сентября 2010

В Linux у меня есть код на C ++, где я хочу запустить другое приложение. Эта программа выводит некоторые данные в stderr. Поэтому я перенаправляю stderr, вызывая freopen () с stderr в качестве параметра потока. Дело в том, что я хочу перенаправить stderr для другого запущенного процесса.

Вот сценарий, с которым я работаю. Я форк () текущий процесс; в дочернем процессе я перенаправляю stderr; тогда я execv (), чтобы запустить отдельное приложение.

Во-первых, у меня есть Sentry, настроенный для перенаправления вывода stderr. Вот код:

class StderrSentry {
public:
  StderrSentry() {
    freopen( "NUL", "wt", stderr );
  }
  ~StderrSentry() {
    fclose( stderr );
  }
};

Далее в коде:

pid_t pid = fork();
int retval=-1;

if( pid < 0 ) {
  success = false;
}
else if( ! pid ) {  // child process
  StderrSentry stdErrSentry;   // REDIRECTING STDERR HERE!
  pid_t chid = setsid();
  if (chid == -1 ) {
    exit(-1);
  }
  else {
    //  HERE IS THE execv() call:
    if( execv(command[0].c_str(), const_cast<char**>(&c_args[0])) < 0 ) {
      exit( -1 );
    }
  }
}
// ... else etc...

Будет ли перенаправление stderr фактически технически действительным, если вызов execv () заменит текущий процесс указанным?

Это на самом деле ведет себя так, как я хочу , но это случайность или это способ сделать это?

Я не могу активировать перенаправление stderr в приложении, которое выполняется в execv, поскольку это не мой код.

Спасибо за любую информацию по этому вопросу.

Ответы [ 3 ]

2 голосов
/ 28 сентября 2010

Обычно безопаснее делать такие вещи с примитивами ОС, работающими с файловыми дескрипторами (open, close, dup2), чем с freopen и друзьями, но да, это должно работать, и как реализованы конвейеры оболочки,execve оставляет открытыми все открытые файлы, если только они не отмечены как F_CLOEXEC.

1 голос
/ 28 сентября 2010

Если дескрипторы файлов не имеют флага O_CLOEXEC (см. Man 2 open), они должны сохраняться в течение exec. Этот флаг доступен только в ядре 2.6.23 и выше, поэтому, если вы используете более старый дистрибутив, он не будет доступен.

0 голосов
/ 28 сентября 2010

Перенаправление очень корректно.Вызов execv изменяет образ процесса, но дескрипторы файлов остаются нетронутыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...