el programa no ejecuta nada después de una llamada al sistema ()

3 minutos de lectura

el programa no ejecuta nada despues de una llamada al
hari

Estoy llamando a un comando a través de una llamada de sistema (comando). Pero no se ejecuta ningún otro código después de esta llamada system().

¿Por qué es así? Pensé que system () crearía un proceso secundario para la ejecución de “comando” y mi programa (padre de “comando”-hijo) continuará ejecutando el código después de eso.

¿No estoy entendiendo system() correctamente?

código:

printf("before \n");
system("tail -f filename");       /* long lived - never returns */
printf("after \n");

Aquí, no veo después de conseguir impreso nunca.

el programa no ejecuta nada despues de una llamada al
Nikolái Fetissov

los system(3) La función hace que su proceso espere a que se complete el proceso secundario.

Editar 0:

Tienes que usar el clásico par de fork(2) y execve(2) por lo que quieres hacer. También puede verificar si su biblioteca C proporciona POSIX spawn(3).

Edición 1:

Examinar waitpid(2) para mantener a los padres cerca.

  • Muchas gracias, ¿hay alguna función en la que solo cree un hijo, deje que se ejecute y también continúe con la ejecución principal?

    – hari

    1 de julio de 2011 a las 20:14

  • Lo más fácil de hacer es system( “tail -f filename&” )

    – William Pursell

    1 de julio de 2011 a las 20:15

  • @William: Gracias :), pero ahora veo un comportamiento interesante: antes de poner “&” cuando estaba ejecutando mi prog, podía ver el nombre de mi prog en la salida “ps”. Ahora, con “&”, no lo veo en “ps”. ¿Porque?

    – hari

    1 de julio de 2011 a las 20:22

  • @hari probablemente porque el programa ahora se está ejecutando hasta su finalización, y para cuando ejecuta ps, ya está terminado

    – William Pursell

    1 de julio de 2011 a las 20:24

  • @Nikolai: Sólo dio cuenta eso :D, tonto de mí. ¿Puedo mantenerlo funcionando y solo terminar después de que termine el niño?

    – hari

    1 de julio de 2011 a las 20:25

Tienes que bifurcar (2) para continuar ejecutando el código.

  • Sí, acabo de darme cuenta de mi error.

    – Intrépido

    1 de julio de 2011 a las 20:15

Un poco tarde, pero aquí hay una solución (probada y funcionando en Linux):

#include <sstream>
#include <cstdlib> //for system()-calls
#include <thread>


//just a utility-function..
template<typename...P> std::string says(P...p)
    {
        std::string r{};
        std::stringstream ss("");
        (ss<<...<<p);
        r=ss.str();
        return r;
    }

#if defined(YOUR_COMPILERS_LINUX_DETECTION_FLAG)
template<typename...T> void _S_R_A_(const std::string &sc)
    {
        std::string s{};
        s=says("nohup ", sc, " 1&2>/dev/null &"); //like old Windows TSR-call
        std::system(s.c_str());
    }
#else // if defined(YOUR_COMPILERS_WINDOWS_DETECTION_FLAG)
template<typename...T> void _S_R_A_(const std::string &sc) //assuming windows - NOT TESTED!
    {
        std::string s{};
        s=says("start ", sc);
        std::system(s.c_str());
    }
#endif

template<typename...T> void SysRunApp(const std::string &sApp, T...t)
    {
        std::string sa{};
        sa=says(sa, sApp, " ", t...); //caller must ensure parameters are
                                      //correctly spaced/escaped etc
        std::thread(_S_R_A_, sa).detach();
    }

¿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