Мне нужно как-то заблокировать команду в C, чтобы я мог получить ее stderr
Начните с чтения man fork
, man exec
о том, как запустить дочерний процесс.Посмотрите на man 7 signal
, man sigaction
и man wait
, как пожать ребенка.
Наконец, man dup2
.
Непроверенный код для примера:
int pip_stderr[2];
int r;
int pid;
r = pipe(pip_stderr);
assert( r != -1 );
int pid = fork();
assert( pid != -1 );
if (pid == 0) { /* child */
/* child doesn't need to read from stderr */
r = close(pip_stderr[0]); assert( r != -1 );
/* make fd 2 to be the writing end of the pipe */
r = dup2(pip_stderr[1], 2); assert( r != -1 );
/* close the now redundant writing end of the pipe */
r = close(pip_stderr[1]); assert( r != -1 );
/* fire! */
exec( /* whatever */ );
assert( !"exec failed!" );
} else { /* parent */
/* must: close writing end of the pipe */
r = close( pip_stderr[1] ); assert( r != -1 );
/* here read from the pip_stderr[0] */
r = waitpid(pid,0,0); assert( r == pid );
}
Используя dup2 (), мы заменяем stderr (который является fd 2) дочернего элемента записывающим концом канала.pipe () вызывается перед fork ().После разветвления мы также должны закрыть все висячие концы канала, чтобы чтение в родительском процессе фактически получило EOF.
Возможно, есть более простое решение с использованием stdio, но яне осознавая этого.Поскольку popen () запускает команду через оболочку, возможно, можно сказать ей перенаправить stderr в stdout (и отправить stdout в / dev / null).Никогда не пробовал.
Можно также использовать mktemp () (man 3 mktemp
) для создания имени временного файла, составить команду для system (), чтобы перенаправить stderr команды во временный файл и после system ()возвращает прочитанный временный файл.