Quiero ejecutar un comando de shell en mi programa c. Pero el problema es que no quiero que mi programa espere hasta que se ejecute el comando. No es necesario leer el resultado del comando de shell (no devuelve datos de todos modos) Entonces, básicamente, ¿es posible?Ejecutando un comando de shell en un programa c
Respuesta
fork()
y system()
es lo que necesita
Junto con exec() o sus variantes, probablemente. – PhD
'system' haría que el proceso hijo esperara el comando shell -' exec' reemplazaría el proceso secundario con el shell. – rlc
@Ronald: no. Reemplaza el proceso secundario con otro proceso. No está claro desde el OP si quiere ejecutar otro programa o una línea de comando de shell, pero si es el último, entonces solo system() hará el truco. ejecutivo no involucra el shell. –
Claro, sólo fork
y exec
: utilizar fork
para crear un nuevo proceso y, en el proceso hijo, utilice exec
para iniciar el shell con el comando. execv
toma los argumentos que normalmente le daría al shell.
Su código podría tener este aspecto:
pid_t child_pid = fork();
if (child_pid == 0)
{ // in child
/* set up arguments */
// launch here
execv("/bin/sh", args);
// if you ever get here, there's been an error - handle it
}
else if (child_pid < 0)
{ // handle error
}
el proceso hijo enviará una señal SIGCHLD
cuando muere. Este código citado del estándar POSIX (SUSv4) se encargará de que:
static void
handle_sigchld(int signum, siginfo_t *sinfo, void *unused)
{
int status;
/*
* Obtain status information for the child which
* caused the SIGCHLD signal and write its exit code
* to stdout.
*/
if (sinfo->si_code != CLD_EXITED)
{
static char msg[] = "wrong si_code\n";
write(2, msg, sizeof msg - 1);
}
else if (waitpid(sinfo->si_pid, &status, 0) == -1)
{
static char msg[] = "waitpid() failed\n";
write(2, msg, sizeof msg - 1);
}
else if (!WIFEXITED(status))
{
static char msg[] = "WIFEXITED was false\n";
write(2, msg, sizeof msg - 1);
}
else
{
int code = WEXITSTATUS(status);
char buf[2];
buf[0] = '0' + code;
buf[1] = '\n';
write(1, buf, 2);
}
}
exec no implica el shell. supongamos que el OP quiere ejecutar 'ls | grep -v hola'. Esto funcionará con el sistema, pero no funcionará con el ejecutivo. –
el OP puede pasarlos al shell - el sistema hace lo mismo (pero hace otro 'fork' y' exec' detrás de las escenas). – rlc
código try así:
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char ** argv)
{
if (!fork())
{
execv("ls", {"myDir"}); /* Your command with arguments instead of ls. */
}
}
Esto me parece demasiado rápido y sucio ya que esto crearía un proceso zombie desde el momento en que el comando sale hasta las salidas principales. Un programa Unix con buen comportamiento querría evitar eso. Ver otras respuestas que usan 'waitpid'. – Jens
Lo siento. No soy tan bueno con las * nix APIs :). – JackMc
¿Qué pasa simplemente amplificar el comando con system ("command &")
?
- 1. Ejecutando un comando de shell desde Node.js sin buffering salida
- 2. Ejecutando un programa C en Linux
- 3. Linux: escriba un programa en C que 'controla' un shell
- 4. Ejecutando un programa de consola C++ en pantalla completa
- 5. Ejecutando un programa matlab con argumentos
- 6. ejecutando el comando de shell en el fondo del script
- 7. ejecutando un comando sobre ssh, y luego ejecutando bash
- 8. Ejecutando un mini-programa en Mono.Csharp
- 9. Ejecutando un comando almacenado en una variable de Powershell
- 10. Manejando `argv` en un programa de línea de comando C
- 11. cómo usar un script de shell para supervisar un programa?
- 12. ¿Cómo puedo ejecutar un comando de línea de comando desde un programa en C++
- 13. Ejecutando un archivo por lotes en el shell git
- 14. Ejecutando un comando del sistema en Haskell
- 15. Ejecutando un programa/script de QMake
- 16. Ejecutar un comando Linux en el programa c
- 17. ejecutando el comando de shell con | (tubería) usando NSTask
- 18. Ejecutar un comando de shell desde un script de shell sin detenerse si se produce un error
- 19. Shell script para detener un programa java
- 20. Ejecutando un comando linux desde python
- 21. Cómo ejecutar un comando de shell a través de Python
- 22. ¿Es posible hacer que un script bash shell interactúe con otro programa de línea de comando?
- 23. Ejecutar un comando de shell cuando se agrega un archivo
- 24. Ejecutando un comando desde Ruby mostrando y capturando la salida
- 25. Cómo ejecutar un comando de shell desde un script php
- 26. Ejecutando un programa Java de fondo en Tomcat
- 27. Uso de variables en un comando de shell vim
- 28. Iniciando un programa C++ oculto
- 29. Groovy ejecutando comandos de shell
- 30. Uso de telnet en un programa C
Por cierto, no importa si desea ejecutar un comando de shell u otro ejecutable. Ya sea que use 'system()' o el enfoque 'fork()/exec()', todo lo que se requiere es un ejecutable. ¿Quizás quieras editar el título de tu pregunta en consecuencia? – Jens