popen
definitivamente hace el trabajo que está buscando, pero tiene algunos inconvenientes:
- Se invoca un shell en el comando que está ejecutando (lo que significa que es necesario ningún untaint cadenas de comandos de usuario proporcionado)
- sólo funciona en una dirección, o bien se puede proporcionar información al subproceso o puede leer su salida.
Si desea invocar un subproceso y proporcionar entrada y salida de capturar a continuación, tendrá que hacer algo como esto:
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);
}
Por supuesto, se puede reemplazar el execlp
con cualquiera de los otros exec funciona según corresponda
ver el enlace de @Mehrdad, tiene un ejemplo con ls =) – bayda