[C con Clase] Dudas con procesos, system(), fork()...

Steven Davidson srd4121 en njit.edu
Vie Jul 18 06:47:26 CEST 2008


Hola Stereo,

Stereo System wrote:
> Hola a todos... 
> 
> He buscando informacion al respecto y la funcion system(), engloba a
> execl, fork, y wait... por tanto si quiero ejecutar otro programa
> como proceso hijo utilizo la funcion system() ?? , me podrian aclarar
> esto..
> 

Primeramente, supongo que tienes las bibliotecas para estas funciones de 
UNIX, aunque creo que también pertenecen al estándar POSIX. En segundo 
lugar, 'system()' no engloba a las otras funciones de UNIX; se trata de 
una función estándar de ANSI. Por último, sospecho que has 
malinterpretado alguna descripción en inglés que habla de "system 
function" o "system call". Las funciones 'fork()', 'wait()', y la gama 
de 'exec()' son llamadas del sistema operativo.

> En mi funcion nesecito ejecutar otro programa, osea otro proceso y
> que ambos procesos Padre e Hijo se ejecuten simultaneamente... y solo
> si el proceso Padre termina de ejecutarse el Hijo se detenga..
> 
> Os pregunto por que no he encontrado informacion acerca del tema en
> google, sobre los dos procesos simultaneos....

Para crear programas que manejen procesos o hilos, necesitas bibliotecas 
externas - no estándares - dedicadas a tu plataforma y compilador. Si 
estás en la plataforma de UNIX, como puede ser Linux, entonces deberías 
tener acceso a varias bibliotecas para manejar este tema.

Para usar 'exec()', necesitarás escoger una función particular de las 
existentes, como por ejemplo, 'execv()' si tienes parámetros para tu 
programa en un array de cadenas de caracteres o 'execl()' si tienes 
parámetros "sueltos" como cadenas de caracteres. Por ejemplo,

int main()
{
   execl( "./prog02", "prog02", "-t", "-r 200" );
   ...
}

O incluso,

int main()
{
   const char *args[] = { "prog02", "-t", "-r 200" };
   execv( "./prog02", args );
   ...
}

Aquí, 'args' cumple la misma función que el array de argumentos pasado a 
'main()'.

El "problema" de 'exec()' es que reemplaza la imagen de tu programa por 
la del nuevo programa que quieres ejecutar. Como esto seguramente no es 
lo que quieres, típicamente creamos otro proceso con 'fork()'. Por ejemplo,

int main()
{
   pid_t pidHijo = fork();
   if( pidHijo )
   {
     // Estamos en el proceso del padre
   }
   else
   {
     // Estamos en el proceso del hijo
   }
   ...
}

Si quieres usar ambas funciones conjuntamente, entonces acabarás con un 
programa así:

int main()
{
   pid_t pidHijo = fork();
   if( pidHijo )
   {
     // Estamos en el proceso del padre
   }
   else
     execl( "./prog02", "prog02", "-t", "-r 200" );
   ...
}


Para terminar el proceso hijo antes de tiempo, puedes invocar 'kill()' 
con la señal 'SIGTERM' para que termine. Si ocurre algún error o quieres 
"matar el proceso" inmediatamente, entonces puedes usar la señal 
'SIGKILL'. Por ejemplo,

int main()
{
   pid_t pidHijo = fork();
   if( pidHijo )
   {
     // Estamos en el proceso del padre
     ...
     // Estamos a punto de terminar => termina el proceso hijo
     kill( pidHijo, SIGTERM );
   }
   else
     execl( "./prog02", "prog02", "-t", "-r 200" );
   ...
}

Puedes consultar los siguientes enlaces (en inglés) acerca de estas 
funciones:

http://www.opengroup.org/onlinepubs/009695399/functions/exec.html
http://www.opengroup.org/onlinepubs/009695399/functions/fork.html
http://www.opengroup.org/onlinepubs/009695399/functions/kill.html


Espero haber aclarado las dudas.

Steven





Más información sobre la lista de distribución Cconclase