popen
определенно выполняет ту работу, которую вы ищете, но у нее есть несколько недостатков:
- Вызывает оболочку для команды, которую вы выполняете (что означает, что вам нужно отменить любые предоставленные пользователем строки команд)
- Он работает только в одном направлении, либо вы можете предоставить вход для подпроцесса, либо вы можете прочитать его вывод.
Если вы хотите вызвать подпроцесс и обеспечить ввод и захват вывода, вам придется сделать что-то вроде этого:
int Input[2], Output[2];
pipe( Input );
pipe( Output );
if( fork() )
{
// We're in the parent here.
// Close the reading end of the input pipe.
close( Input[ 0 ] );
// Close the writing end of the output pipe
close( Output[ 1 ] );
// Here we can interact with the subprocess. Write to the subprocesses stdin via Input[ 1 ], and read from the subprocesses stdout via Output[ 0 ].
...
}
else
{ // We're in the child here.
close( Input[ 1 ] );
dup2( Input[ 0 ], STDIN_FILENO );
close( Output[ 0 ] );
dup2( Output[ 1 ], STDOUT_FILENO );
execlp( "ls", "-la", NULL );
}
Конечно, вы можете заменить execlp
любой другой функцией exec в зависимости от ситуации.