En sus respuestas sólo se le permite utilizar las llamadas a sistema de Unix y no las funciones de entrada/salida de alto nivel provistas por la biblioteca estándar de C (familia fopen/fread/fwrite/fclose y todas aquellas que involucren FILE * tanto explícita o implícitamente). Por su parte, puede definir todas las funciones, tipos y estructuras extra que necesite para la implementación de sus respuestas. Las consultas son en el puesto. Se permite el uso de apuntes impresos, fotocopiados, manuscritos, así como libros y computadores para efectos de documentación. Quienes usen computadores deben sentarse en la primera fila.
En Unix existe el comando tail, cuya forma de uso es:
% tail n
Puede asumir que el parámetro n es siempre un número válido mayor o igual que 0 y que hay memoria para las n líneas, así como también que no se producen errores en las operaciones de entrada y salida. Puede usar malloc(). Por simplicidad, puede asumir que cada línea no tiene un largo mayor que LARGO_MAX (incluyendo '\n').
Se dispone del siguiente fragmento de código:
#define MAX_FD (40) int fd_in; int fds_out[MAX_FD]; #define MAX_BUF (4096) char buff[MAX_BUF]; size_t llenado_buff; size_t escrito_buff[MAX_FD]; void copiadora(void) { /* Función ya implementada */ } void asegura_copia(void) { /* Función por implementar que llama a copiadora() */ } int main() { /* Inicialización variables globales */ asegura_copia(); }
El problema es que este programa puede ser interrumpido por dos señales distintas:
Se le pide que implemente la función asegura_copia (así como otras funciones que necesite) de modo que maneje las señales mencionadas para que copiadora pueda seguir funcionando correctamente sin darse cuenta de qué ocurrió con las señales. El comportamiendo deseado es el siguiente:
Se necesita una función que indique si un número es o no primo utilizando varios procesadores para hacer cálculos parciales en procesos separados, sincronizando sus resultados en paralelo. Para ello, se le pide que implemente la siguiente función:
typedef unsigned long long int ullint_t; int primo_par(ullint_t n, unsigned int n_procs);
Aquellas soluciones que no usen esta cantidad de procesos o no lo hagan en paralelo (en forma útil) no serán evaluadas. Puede asumir que n_procs es mayor que cero y que n es lo suficientemente grande como para que valga la pena usar todos los procesos pedidos. También puede asumir que todas las llamadas a fork() son exitosas y que todos los procesos terminan correctamente.
Hint: Para obtener la información de los procesos hijo puede usar la macro int WEXITSTATUS(int status), que obtiene el código de retorno del hijo a partir del estado obtenido por wait.