2012-03-20 21 views
5

Tengo experiencia en el uso de procesos y subprocesos en Windows.Temas/Comparación de procesos en Linux/Windows

Que alguien lo explique, ¿hay alguna asignación posible de los hilos y procesos en Windows al igual en Linux?

Eso significa, Hilos en Windows == ¿Hilos en Linux? -> ¿Tiene algún sentido? Proceso en Windows == Proceso en Linus? -> ¿Tiene algún sentido?

Si es el mismo, tengo llamadas CreateThread() y CreateProcess() en windows, ¿cuáles son las llamadas equivalentes en linux?

He leído algunas publicaciones en SO, pero la mayoría de ellas no han aclarado mis dudas. Así que pensé comenzar una nueva publicación.

Sería bueno si tuviera alguna explicación con algunos ejemplos simples (programación en C).

+2

Busque el ['pthread_create'] (http://linux.die.net/man/3/pthread_create) y [' fork'] (http://linux.die.net/man/2/fork) llamadas en Linux. –

+1

Y no espere una equivalencia entre las llamadas al sistema Linux y Windows. Los conceptos y la terminología son ligeramente diferentes. –

+0

Bueno, estrictamente, Linux no tiene hilos en absoluto, solo conoce procesos y, más recientemente, procesos que comparten un espacio de direcciones y/o descriptores de archivos. Además, nunca crea nuevos procesos, solo hace copias de ellos. Hasta ahora, incluso si se pueden lograr resultados finales similares o idénticos, no existe una correspondencia real 1: 1 en cómo funcionan las cosas. – Damon

Respuesta

6

Bueno, hay llamadas equivalentes para su propósito en Linux, pero funcionan un poco diferente, al menos para el mecanismo de proceso.

  1. Para hilos, puede usar pthread_create. Funciona de manera muy similar a CreateThread, excepto que algunos parámetros son diferentes. Debería ser muy fácil de usar. Aquí hay un buen tutorial: https://computing.llnl.gov/tutorials/pthreads/

  2. Emular CreateProcess para iniciar un proceso externo no es tan sencillo. Necesitarás el famoso combo fork/exec. Primero, debe llamar al fork dentro del proceso principal para generar un proceso secundario. Este niño se crea al duplicar el proceso inicial. A continuación, puede controlar el flujo comprobando el valor devuelto por fork:

int rv = fork(); 
// new process was spawned here. The following code is executed 
// by both processes. 
if(rv == 0) 
{ 
    // we are in the child process 
} 
else 
{ 
    // we are in the parent 
} 

Básicamente rv será 0 para el niño y el pid del hijo por el padre. Espero no haberte perdido hasta ahora. :)

Cambiando de tema, se necesita una llamada a uno de los exec familia de funciones para iniciar un proceso externo:

int rv = fork(); 
// new process was spawned here. The following code is executed 
// by both processes. 
if(rv == 0) 
{ 
    execl("/bin/ls", "ls", NULL); // start the ls process 
} 
else 
{ 
    // we are in the parent 
} 

En el ejemplo anterior, estoy empezando la /bin/ls externa proceso, que imprime los contenidos de la carpeta actual.

Aquí está un ejemplo sencillo completo: http://flinflon.brandonu.ca/dueck/2001/62306/Processes/Unix%20Examples.htm

Ahora usted puede preguntarse por qué es necesario llamar fork en el primer lugar y por qué execl no es suficiente. Esto se debe a que una vez finalizado el programa invocado por execl, el proceso actual también finaliza y no desea que eso suceda en el proceso principal.

+0

Gracias .... Buena respuesta. –

+0

: No es posible iniciar el nuevo proceso tan pronto como devuelve la horquilla(). Quiero decir que no necesitamos ejecutar la siguiente línea después de la horquilla(), si es posible pasar el ejecutable a generado como parte de la horquilla, eso sería lógico como el createProcess en Windows? –

+0

@Renjith G: me temo que no. 'fork' no toma ningún parámetro. Su único propósito es duplicar el proceso actual en uno nuevo. 'fork/exec' es la forma estándar de Linux para iniciar un proceso externo. – Tudor