c++ vector execvp

c++ - Cómo pasar un vector a execvp



(3)

Sí, se puede hacer de forma bastante limpia aprovechando la matriz interna que utilizan los vectores.

Esto funcionará, ya que el estándar garantiza que sus elementos se almacenan contiguamente (ver https://stackoverflow.com/a/2923290/383983 )

#include <vector> using std::vector; int main() { vector<char*> commandVector; // do a push_back for the command, then each of the arguments commandVector.push_back(const_cast<char*>("echo")); commandVector.push_back(const_cast<char*>("testing")); commandVector.push_back(const_cast<char*>("1")); commandVector.push_back(const_cast<char*>("2")); commandVector.push_back(const_cast<char*>("3")); // push NULL to the end of the vector (execvp expects NULL as last element) commandVector.push_back(NULL); int status = execvp(command[0], &command[0]); return 0; }

Realice un const_cast para evitar la "conversión en desuso de la constante de cadena a ''char *''". Los literales de cadena se implementan como ''const char *'' en C ++. const_cast es la forma más segura de lanzar aquí, ya que solo elimina la const y no hace ningún otro negocio divertido. execvp no editará los valores de todos modos.

Si quieres evitar todos los lanzamientos, tienes que complicar este código copiando todos los valores en tipos ''char *'' que realmente no lo valen.

Aunque si se conoce el número de argumentos que desea pasar a execv / execl, es más fácil escribir esto en C.

Quiero pasar un vector como el segundo argumento para execvp. ¿Es posible?


No directamente; necesitaría representar el vector como una matriz terminada en NULL de punteros de cadena de alguna manera. Si es un vector de cadenas, eso es sencillo de hacer; si se trata de algún otro tipo de datos, deberá calcular cómo codificarlo como cadenas.


Sí, se puede hacer de forma bastante limpia aprovechando la matriz interna que utilizan los vectores.

Esto funcionará, ya que el estándar garantiza que sus elementos se almacenan contiguamente (ver https://.com/a/2923290/383983 )

#include <vector> using namespace std; int main(void) { vector<char *> commandVector; // do a push_back for the command, then each of the arguments commandVector.push_back("echo"); commandVector.push_back("testing"); commandVector.push_back("1"); commandVector.push_back("2"); commandVector.push_back("3"); // push NULL to the end of the vector (execvp expects NULL as last element) commandVector.push_back(NULL); // pass the vector''s internal array to execvp char **command = &commandVector[0]; int status = execvp(command[0], command); return 0; }