Directorio de artículos
- Contenidos principales del proyecto: 1. DO online 2. Equilibrio de carga
- manifestación
- tecnología utilizada
- empieza a darte cuenta
-
- 02Preparación de proyectos
- 03Desarrollo de funciones de compilación
- 04Desarrollo de funciones de registro
- 05 desarrollo de registro de llamadas
- 06 Módulo de compilación de prueba
- 07 Ejecutar módulos de función
- 08 módulo de prueba
- 09. Introducción a las limitaciones de recursos
- 10. Establecer límites de recursos para el corredor
- 11. Conoce jsoncpp
- 12. Escribir cr módulo 1
- 13. Escribir cr módulo 2
- 14. Escribir cr módulo 3
- 15. Escribir cr módulo 4
- 16. Escribir cr módulo 5
- 17. Resuelve el error de sintaxis del módulo cr
- 18. Módulo cr de depuración integral
- 19. Limpiar archivos temporales
Contenidos principales del proyecto: 1. DO online 2. Equilibrio de carga
Tres módulos:
1. Comunicación de módulo común
Proporciona operaciones de cadena, procesamiento de archivos, solicitudes de red, etc.
2. Compile y ejecute el módulo OJ_server
Centrándonos en el servidor, cuando el usuario envía el código, el usuario envía el código para formar un archivo temporal en nuestro servidor, lo compila y lo ejecuta, y obtiene el resultado de la ejecución;
3. Módulo Juez en línea
Usando el patrón de diseño MVC, podemos llamar al módulo de compilación de back-end y acceder a archivos o bases de datos, y mostrar nuestra lista de temas e interfaz de edición a los usuarios, para que los usuarios puedan operar normalmente
Después de compilar, se formarán dos programas ejecutables: 1. Servidor de compilación 2. Servidor OJ en línea Los dos servidores se comunican entre sí a través de sockets de red, de modo que el módulo de compilación se pueda implementar en el backend del servidor Hay varias máquinas , y solo tenemos un OJ_server, por lo que nuestro servidor OJ_server seleccionará el servicio de compilación de back-end de manera equilibrada, de modo que podamos generar nuestro servicio OJ en línea externamente en forma de capacidades de procesamiento de clúster, por lo que somos un proyecto totalmente extensible
manifestación
1. Función 1: DO en línea:
Este módulo de escritura de preguntas de OJ en línea se implementa en la interfaz con un pequeño complemento con menos de 20 líneas de código.
2. Función 2: equilibrio de carga
Finalización clave: 1. Después de completar la lista de temas principales, el tema se puede grabar automáticamente y la función de registro de temas no es el foco (lo que implica la gestión de autoridades, varias páginas frontales) 2. DO en línea, que puede manejar varios informes de errores , y el back-end usa archivo + base de datos o base de datos, 3. Realizar el equilibrio de carga básico
(completado es una subfunción en Lituo/Niuke)
tecnología utilizada
empieza a darte cuenta
02Preparación de proyectos
1.
2. Implementación en vscode
Cuando el usuario envía el código, debemos seleccionar un host (compile_server) para equilibrar la carga
Modo CS: cliente/servidor
Modo BS: modo navegador/servidor
03Desarrollo de funciones de compilación
El servicio de compilación compile_server eventualmente proporcionará un servicio de red llamado compilar y ejecutarse en forma de una red
- El archivo compilado necesita crear 3 nombres de archivo
- Cuando el archivo entrante no tiene un sufijo, debe generar un sufijo automáticamente (crear un nuevo util.hpp en comm)
Si la compilación es exitosa, el archivo se guardará ¿
Qué pasa si la compilación no es exitosa? Volverá falso, pero ¿cuál es el motivo del error de compilación?
Una vez que ocurre un error de compilación, g++ imprimirá un mensaje de error. Si desea obtener este mensaje de error, debe
abrir el archivo de error estándar antes del reemplazo del subproceso y luego completar la función de redirección. Si ocurre un error de compilación, escriba la compilación información de error en el estándar En el archivo de error,
04Desarrollo de funciones de registro
En él se utilizará la función Timeutil, que debe definirse en util
- definir macro
05 desarrollo de registro de llamadas
- elemento de la lista
obtener marca de tiempo
- Obtenga la marca de tiempo (_time.tv_sec obtiene el tiempo en segundos)
- agregar registro
06 Módulo de compilación de prueba
El módulo de compilación se completó en el capítulo anterior, y ahora es necesario probar el módulo de compilación.
Llame a la función Compile de compiler.hpp en compile_server.cc
Pero, ¿de dónde proviene el nombre del archivo? Debería haber algunos archivos necesarios en el archivo temporal de compile_server
. Después de ejecutar, descubrí que la compilación falló. ¿
Cuál es el problema?
Después de la corrección, la compilación fue exitosa.
07 Ejecutar módulos de función
Cuando se ejecuta, debe ejecutarse en el proceso hijo, y el proceso principal (proceso padre) no se puede ejecutar, ya que si hay un reemplazo en el proceso padre, se reemplazarán todos los módulos compilados. se formará un error de compilación con el mismo nombre.Si queremos
poner
la entrada estándar, la salida estándar y el error estándar también se almacenan:
entonces, ¿cómo se obtiene la entrada estándar?
Abra el archivo
Si alguno de los tres archivos no se abre, devolverá el error al abrir el archivo. La
entrada, la salida y el error estándar predeterminados del proceso secundario son originalmente el teclado, la pantalla y la pantalla. Ahora deben ser redirigido a los tres archivos abiertos. Juicio
de reemplazo
¿El programa se está ejecutando de manera anormal? ¿
Por qué el valor de retorno del módulo de ejecución debe definirse como int?
08 módulo de prueba
Compile y
ejecute Ejecute con éxito, luego agregue el registro
Si desea volver a compilar la prueba, puede eliminar el archivo temporal generado antes de
la Prueba: Si hay un error en la ejecución
La siguiente es la extensión a la segunda función del módulo corredor:
09. Introducción a las limitaciones de recursos
1. Tiempo de espera de uso de la CPU: si alguien ataca maliciosamente y ocupa los recursos de la CPU, se deben usar ciertos medios para terminarlo 2.
Falla de la aplicación de memoria: si hay demasiada memoria ocupada, continuará solicitando espacio, que debe ser restringido.Después
del límite
, los recursos son insuficientes, lo que resulta en que el sistema operativo finaliza el proceso a través de una señal.Después
de ejecutar, puede ver la señal devuelta para determinar dónde radica el problema.
10. Establecer límites de recursos para el corredor
Proporcionar una interfaz para establecer el tamaño del recurso ocupado por el proceso
11. Conoce jsoncpp
La tercera función: función compile_run: compile y ejecute la función
(adaptarse a las solicitudes del usuario, necesita personalizar el campo del protocolo de comunicación)
(llamar correctamente a compilar y ejecutar)
(formar un nombre de archivo único) después de
la modificación
Instalar json
y compilar directamente reportará un error, porque no sé las cosas anteriores ¿
Cómo solucionarlo? ------Introduzca la biblioteca -ljsoncpp,
también puede cambiar el formato
, comencemos a editar Inicio
12. Escribir cr módulo 1
Serialización de la última lección: convertir múltiples valores kv en una cadena
Deserialización en esta lección: analizar una cadena en múltiples valores kv
ya ha deserializado el valor, ¿cómo lo hago después de la deserialización? ¿Qué pasa con obtener el código de entrada estándar del usuario? y numero?
Extraiga el código del usuario e ingrese
si el código enviado por el usuario está vacío
Si no está vacío:
forme un nombre de ruta único y escriba el contenido del código en el archivo temporal.
A continuación, debe escribir un método para formar un nombre de ruta único. UniqFileName
Después de formar un nombre de archivo único, debe escribir el contenido del código en el archivo temporal. archivo medio
¿Cómo resolver el problema de los sufijos? Se puede usar el método escrito anteriormente: el nombre de la función con el sufijo especificado se puede generar en el archivo especificado
Interfaz de entrada: agregar requisitos de tiempo, requisitos de espacio
Ahora solo se procesa in_json, out_json no se ha procesado y algunos errores no se han procesado
13. Escribir cr módulo 2
Obligatorio: El código de estado: 0/1/2, etc., lo determina el cliente
Razón: La razón de este error (si fue un error durante la compilación, por qué salió mal; si fue un error en tiempo de ejecución, por qué salió mal)
Opcional: stdout: si se ejecuta correctamente, ¿cuál es el resultado
stderr: si hay un problema con la operación, ¿cuál es el resultado? Manejo
del problema de error
El siguiente código se procesa antes y
después del procesamiento: si el El archivo src no se genera, la salida (sabemos que es un problema del servidor, pero no podemos decirle al usuario)
Después de completar los pasos anteriores, significa que hemos obtenido el valor deseado, el código correspondiente no está vacío y el el código se escribe con éxito en el archivo y el siguiente paso es la compilación. A continuación, juzgue si la compilación se ha realizado correctamente. Antes de la modificación: después de la modificación:
si
la
compilación falla, necesita saber la causa de la falla, por lo que debe leer el archivo de error generado antes, por lo que debe escribir una función para leer el archivo de error
para juzgar si la operación es incorrecta.De
acuerdo con el método de escritura anterior, cada función debe escribir el error correspondiente, demasiado problema. Puede recopilar los errores en status_code y luego llamar a la
resonancia de la señal de error correspondiente en cada función. ¿Cómo lidiar con esto? Primero, cambie el nombre de la función. Antes de la modificación: Después de la modificación
:
si la operación es exitosa, debemos ejecutar los resultados, y los resultados son todos Se redirige a Stdout y Stderr, por lo que necesitamos leer de Stdout y Stderr
A continuación, debemos hacer la serialización, como antes, llamar al método de escritura para formar una cadena y luego generar
toda la estructura módulos arriba A continuación, debe agregar los módulos sin terminar en el interior.
14. Escribir cr módulo 3
Si ocurre un error en tiempo de compilación, también queremos saber el contenido del archivo donde ocurrió el error en tiempo de compilación
.
15. Escribir cr módulo 4
Obtenga una marca de tiempo de milisegundos + valor único de incremento atómico para garantizar la exclusividad
Lo anterior logra un nombre de archivo único
16. Escribir cr módulo 5
Complete la función de escritura de archivos
Lectura de archivos
Al leer archivos, a veces necesita mantener \n, pero getline no leerá \n.
A continuación, llame a esta función en el archivo en ejecución
Antes de la modificación:
Después de la modificación:
17. Resuelve el error de sintaxis del módulo cr
Después de la modificación, se ejecuta y luego necesitamos diseñar casos de prueba.
18. Módulo cr de depuración integral
Escriba una prueba simple primero.
Esta es una característica nueva de C++ 11, que puede garantizar que los signos de puntuación especiales en la cadena no se cambien.
Después de ejecutar, el código de error es -3 y se informa un error al compilar.Después
de la modificación: el archivo temporal generado por la
compilación es exitoso.Prueba 1: si la entrada es un bucle infinito, la compilación es exitosa, pero el error el código es 24. Prueba 2: solo se pueden aplicar 10M, pero quiero Solicitar 20M de espacio compartido es demasiado pequeño, solo 10M, y tal vez incluso la biblioteca no se pueda cargar, así que modifique el caso de prueba.Después de la modificación, solo 30M pueden ser aplicado, pero quiero solicitar 50M y la compilación es exitosa, pero el código de error es 6. Prueba 3: número de coma flotante Prueba de error 4:
19. Limpiar archivos temporales
Para borrar un archivo, primero debe determinar si el archivo existe. Escribí una función para determinar si el archivo existe antes, y use directamente el
comando de eliminación: desvincular
Por lo tanto, cuando el archivo exista, elimínelo