Usando la familia exec() para ejecutar el comando “cd”

3 minutos de lectura

Usando la familia exec para ejecutar el comando cd
mentecato

Yo sé eso cd es un shell incorporado, y puedo ejecutarlo usando system().

Pero, ¿es posible ejecutar el cd comando por el exec() familia, como execvp()?

Editar: Y me acabo de dar cuenta de que system("cd") tampoco tiene sentido。Gracias por la ayuda de todos.

exec carga un Archivo ejecutable y reemplaza la imagen del programa actual con ella. Como bien has señalado, cd es no un archivo ejecutable, sino un shell incorporado. Entonces, el ejecutable que desea ejecutar es el shell mismo. Esto es por supuesto lo que system() hace por ti, pero si quieres ser explícito al respecto, puedes usar exec:

execl("/bin/sh", "-c", "cd", (const char *)0);

Desde esto reemplaza su imagen de proceso actual, debe hacer esto después fork()iniciando un nuevo proceso.

Sin embargo, todo este procedimiento no tiene absolutamente ningún efecto. Si desea cambiar el directorio en su proceso actual, utilice chdir().

  • ¿Puede explicar lo que representa el argumento?

    – Usuario

    16 de marzo de 2015 a las 4:20

  • @Usuario: los argumentos conforman el comando que se está ejecutando, y dado que esta es una función de argumento variable, tenemos que señalar el final de los argumentos de alguna manera, lo que en este caso se hace mediante un puntero nulo de tipo const char *. Entonces el comando que se ejecuta es: /bin/sh -c cd

    – KerrekSB

    16 de marzo de 2015 a las 9:21

Es mejor que uses int chdir(const char *path); encontrado en unistd.h.

No, no lo es, y no serviría de nada. chdir (la función que cambia el directorio actual de un proceso) solo afecta al proceso que lo llama (ya sus hijos). No afecta a su padre en particular.

Entonces execEn g cd no tiene sentido, ya que el proceso saldría inmediatamente después de haber cambiado de directorio.

(Podría ejecutar algo como bash -c cd /tmp si realmente quieres, pero como dije, esto es infructuoso).

1647635947 376 Usando la familia exec para ejecutar el comando cd
jlliagre

Si bien, como ya se dijo system("cd xxx") no cambiaría el directorio actual de su aplicación, no es completamente inútil.

Todavía puede usar el estado de salida del sistema para saber si cambiar su directorio actual al indicado tendrá éxito o no.

Del mismo modo, si te gustan las soluciones complejas, también puedes hacer lo mismo con fork/exec, ya sea con exec’ing /bin/sh -c cd xxx o simplemente /bin/cd xxx con sistemas operativos que proporcionan una cd ejecutable.

Sin embargo, recomendaría este equivalente más rápido no exagerado access("xxx", X_OK|R_OK)

Nota: Todos los sistemas operativos compatibles con POSIX deber proporcionar un ejecutable de cd independiente. Este es al menos el caso de Solaris, AIXHP-UX y Mac OS X.

Cuando se realiza una bifurcación, la variable de entorno CWD (directorio de trabajo actual) es heredada por el elemento secundario del padre. Si la bifurcación y la ejecución se realizan como de costumbre, el elemento secundario llama a chdir(), que simplemente cambia el directorio al nuevo directorio y sale pero esto no afecta al padre. Por lo tanto, el nuevo entorno se pierde.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad