que procesos proceso manejo hijo funcion entre comunicacion c process

manejo - procesos en c



¿Cómo generas otro proceso en C? (8)

En UNIX, creo que básicamente es necesario bifurcarlo si desea que el proceso engendrado se ejecute separado de su spawing: por ejemplo, si no desea que su proceso engendrado termine cuando abandone su proceso de desove.

Aquí hay una página que explica todas las diferencias sutiles entre Fork, System, Exec.

Si trabajas en Win, Mac y Linux, puedo recomendarte Qt Framework y su objeto QProcess , pero no sé si esa es una opción para ti. Las grandes ventajas es que podrá compilar el mismo código en Windows Linux y Mac:

QString program = "./yourspawnedprogram"; QProcess * spawnedProcess = new QProcess(parent); spawnedProcess->start(program); // or spawnedProcess->startDetached(program);

Y, por añadidura, puede incluso eliminar el proceso hijo del proceso principal y mantener comunicación con él a través de una transmisión.

¿Cómo se ejecuta un programa externo y se pasan parámetros de línea de comando con C? Si tiene que usar la API del sistema operativo, incluya una solución para Windows, Mac y Linux.


Hablando de recetas dependientes de la plataforma, en Windows use CreateProcess , en Posix (Linux, Mac) use fork + execvp . Pero el system() debe cubrir sus necesidades básicas y es parte de la biblioteca estándar.


Quiero dar una gran advertencia de que no use el sistema y que nunca use el sistema al 100% cuando escribe una biblioteca. Fue diseñado hace 30 años cuando el sistema operativo de juguete desconocido Unix desconocía el subprocesamiento múltiple. Y aún no es utilizable, incluso cuando casi todos los programas son multiproceso en la actualidad.

Use popen o haga un fork + execvp, todo lo demás le dará problemas difíciles de encontrar con el manejo de señales, bloqueos en el código de manejo del entorno, etc. Es pura maldad y una pena que la respuesta seleccionada y la más valorada sea promover el uso del "sistema" ". Es más saludable promover el uso de Cocaína en el lugar de trabajo.


Realmente depende de lo que estás tratando de hacer, exactamente, ya que es:

  1. Dependiente del SO
  2. No está muy claro lo que estás tratando de hacer.

Sin embargo, intentaré proporcionarle cierta información para que usted decida.
En UNIX, fork() crea un clon de su proceso desde el lugar donde llamó fork. Es decir, si tengo el siguiente proceso:

#include <unistd.h> #include <stdio.h> int main() { printf( "hi 2 u/n" ); int mypid = fork(); if( 0 == mypid ) printf( "lol child/n" ); else printf( "lol parent/n" ); return( 0 ); }

La salida se verá de la siguiente manera:

hola tú
lol niño
lol padre

Cuando fork() el pid devuelto en el hijo es 0, y el pid devuelto en el padre es el pid del niño. Tenga en cuenta que "hi2u" solo se imprime una vez ... por el padre .

execve() y su familia de funciones casi siempre se usan con fork(). execve() y similares sobrescriben la pila actual con el nombre de la aplicación que le pasas. execve() casi siempre se usa con fork() donde bifurca un proceso secundario y si usted es el padre hace lo que necesita para seguir haciendo y si es el hijo ejecuta un nuevo proceso. execve() también se usa casi siempre con waitpid() - waitpid toma un pid de un proceso secundario y, literalmente, espera hasta que el hijo finalice y le devuelve el estado de salida del hijo.

Usando esta información, debería poder escribir un shell muy básico; uno que toma los nombres del proceso en la línea de comando y ejecuta los procesos que usted le indica. Por supuesto, los proyectiles hacen más que eso, como la entrada y salida de las tuberías, pero usted debe ser capaz de lograr lo básico usando fork() , execve() y waitpid() .

NOTA: ¡Esto es * nix específico! Esto NO funcionará en Windows.

Espero que esto haya ayudado.


Si desea realizar operaciones más complicadas, como leer la salida del programa externo, la llamada del sistema popen le servirá mejor. Por ejemplo, para acceder mediante programación a una lista de directorios (este es un ejemplo algo tonto, pero útil como ejemplo), podría escribir algo como esto:

#include <stdio.h> int main() { int entry = 1; char line[200]; FILE* output = popen("/usr/bin/ls -1 /usr/man", "r"); while ( fgets(line, 199, output) ) { printf("%5d: %s", entry++, line); } }

para dar salida como esta

1: cat1 2: cat1b 3: cat1c 4: cat1f 5: cat1m 6: cat1s ...


Si necesita verificar / leer / analizar la salida de su comando externo, sugeriría usar popen () en lugar de system ().



#include <stdlib.h> int main() { system("echo HAI"); return 0; }