Pregunta

Tengo un problema a resolver que no tengo idea de cómo hacerlo porque sólo hay un par de llamadas al sistema que podemos utilizar para resolverlo y no veo la manera en que son útiles para la situación.

El Ejercicio:
He matriz de tamaño [10][1000000] con números enteros, y por cada línea que crear un nuevo proceso con fork().La idea de que cada proceso es ir a través de todos los números de línea y encontrar un número específico, a continuación, imprimir un mensaje.Este fue el primer paso del problema y se hace.El segundo paso es imprimir el total de ocurrencias de ese número en cada línea por fin.Y en el final, el total de ocurrencias de ese número.

Las Llamadas:
El sistema de llamadas que puede utilizar son descritos como esta en el documento para este ejercicio:

  • pid_t fork(void);
  • void exit(int status);
  • pid_t wait(int *status);
  • pid_t waitpid(pid_t pid, int *status, int options);

El Problema:
No tengo idea de cómo hacerlo porque el exit() llamar solo me permite introducir un número por debajo de 256, lo que si el número de ocurrencias es mayor que este número?¿Cómo puedo devolver un número?

Otro Problema:
No sé exactamente a entender la diferencia entre wait() y waitpid() y cómo/dónde el uso de uno sobre el otro.Además de las páginas man, hay más documentación donde puedo ver ejemplos de código y ejemplo para entender mejor?O puede que alguien me explique las diferencias y proporcionar un ejemplo básico que demuestra que tales diferencias?

¿Fue útil?

Solución

Uso waitpid() para obtener la salida de estados de los procesos en secuencia;el uso de wait() no hace ninguna garantía acerca de la secuencia en la que el niño cadáveres serán recuperados.

En Unix, el estado de salida está limitada a 8 bits, el cual puede ser tratado firmado o sin firmar por el programa de recuperación de los datos.Usted también consigue una de 8 bits valor que identifica el número de señal y de volcado de núcleo de estado de la terminación del niño.AFAIK, ya sea el estado o la señal de los bits son siempre cero (y a menudo ambos - cuando el proceso se cierra con éxito).

Si usted no sabe que los números para ser devueltos son menores que 256, a continuación, estado de salida no es el camino a seguir.Como otros han dicho, usted tiene que utilizar algunos otros IPC en ese caso.Si el único sistema de llamadas permitidas son aquellas, entonces tenemos que concluir que los valores serán de menos de 255, o que se desborda, no importan.Tampoco es satisfactoria como conclusión fuera una tarea de ejercicio, pero en el "mundo real", no está limitado a sólo 4 sistema de llamadas.

Ver también Códigos de salida mayor que 255?.Tenga en cuenta que en Windows, el rango de códigos de salida es mucho mayor, pero no usa el sistema de llamadas en la pregunta.


Observación:cuando hago exit(1), el valor en estado de wait() es de 256;hay una razón para eso?

Respuesta:sí.Los 8 bits más bajos de la palabra de estado codificar el número de señal y así sucesivamente;los 8 bits de la (16 bits) palabra de estado codificar el estado de salida.

Ver <sys/wait.h> y macros WIFEXITED(), WEXITSTATUS(), etc.

Otros consejos

Creo que lo que está haciendo debe trabajar muy bien - sólo devolverá el número de ocurrencias como el código de salida del proceso.

Usted menciona que la salida () sólo se permiten números debajo de 256. Dudo mucho si este es el caso, pero sería lo suficientemente simple para que usted escriba un programa de prueba para salir de dudas.

Sonidos como esto es en realidad una versión simplificada de href="http://en.wikipedia.org/wiki/MapReduce" Map-Reduce . Es posible que desee echar un vistazo a ese algoritmo, así como para algunas ideas sobre cómo se puede paralelizar aún más el programa - y tal vez obtener algo de crédito adicional:)

En cuanto a la diferencia entre wait () y waitpid () - Si lo que desea es esperar a que alguno de sus procesos secundarios para completar, se usaría wait (). Si quieres que esperar sólo por un proceso secundario específico o si desea comprobar simplemente si un proceso hijo ha terminado sin colgar, se usaría waitpid ().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top