2012-02-19 11 views
6

Teniendo en cuenta el código de abajo:valor de retorno de llamada al sistema vfork()

int main() 
{ 
    int pid; 
    pid=vfork(); 
    if(pid==0) 
    printf("child\n"); 
    else 
    printf("parent\n"); 
    return 0; 
    } 

En caso de vfork() el espacio de direcciones utilizado por proceso padre y el proceso hijo es igual, copiar de manera única de la variable pid Debería estar ahí. Ahora no puedo entender cómo esta variable pid puede tener dos valores devueltos por vfork() es decir, cero para el niño y no cero para el padre?

En caso de tenedor() el espacio de direcciones también se copia y hay dos copias de la variable pid en cada niño y sus padres, así que puede entender en este caso dos copias diferentes pueden tener diferentes valores devueltos por tenedor() pero no puede entender en caso de vfork() cómo pid tienen dos valores devueltos por vfork()?

+2

Eso es letal: puede ejecutar 'exec()' o '_exit()' en el archivo ['vfork()'] (http://pubs.opengroup.org/onlinepubs/009695399/toc.htm) 'd child , pero eso es todo. Casi todo lo demás conduce a un comportamiento indefinido. Recomendación: no use ['vfork()'] (http://pubs.opengroup.org/onlinepubs/007908799/xsh/vfork.html); de hecho, ni siquiera me molestaría en aprender a usarlo de manera segura. Es como 'gets()', una función que es mejor pretender que no existe. –

+1

@JonathanLeffler: 'vfork()' es bastante útil para sistemas sin MMU. – ninjalj

+0

Sí señor, estoy de acuerdo con usted no debería usarlo, pero estaba usando vfork para resolver un problema de creación de árbol de procesos y comunicación entre procesos de diferentes niveles de árbol, en ese caso vfork fue útil tomando una variable global. Mantendré tu consejo. –

Respuesta

6

No hay 2 copias. Cuando llama al vfork el padre se congela mientras el hijo hace lo suyo (hasta que llame al _exit(2) o execve(2)). Entonces, en cualquier momento, solo hay una sola variable pid.

Como nota al margen, lo que está haciendo es inseguro. The standard hechizos claramente:

El vfork() función será equivalente al tenedor(), excepto que el comportamiento es indefinido si el proceso creado por vfork() o bien modifica los datos distintos de una variable de tipo pid_t usado para almacenar el valor de retorno de vfork(), o retorna de la función en la que se llamó vfork() o llama a cualquier otra función antes llamando a _exit() o una de las familias de ejecutivos de funciones.

Como segunda nota al margen, vfork se ha eliminado de SUSv4 - no hay realmente ninguna razón para usarlo.

+0

Significa que mientras utiliza vfork el proceso creado puede modificar el valor del tipo de variable ** pid_t **, de modo que cuando el hijo sale y el padre reanuda ¿cómo o por quién se restablece el valor anterior de la variable ** pid_t **? ? –

+2

@ L.ppt Cuando el padre continuse 'pid_t' almacenará el PID del niño. – cnicutar

+2

@ L.ppt: el compilador trata especialmente una variable 'pid_t' devuelta por' vfork() '. Siempre está en un registro y no se derrama en la memoria. – ninjalj

Cuestiones relacionadas