¿Cómo "correctamente" evitar las condiciones de la carrera sobre la lectura / escritura de archivos cuando use NODEJS junto con un software C ++? -- javascript campo con node.js campo con express campo con race-condition camp Relacionados El problema

How to “properly” avoid race conditions over reading/writting files when using NodeJs alongside a C++ software?


1
vote

problema

Español

Tengo una interfaz simple que toma algunos valores de entrada, los envía a través de una publicación de Axios a un servidor ExpressJS que los escribe a un archivo. Ese mismo archivo se verifica para los nuevos valores en un intervalo aleatorio de veces por otra pieza de software C ++.
La forma en que he ido fue crear archivos .lock6 asociados con los archivos .lock7 que quiero leer / escribir.
Por lo tanto, el archivo C ++ abre el archivo .lock8 para obtener un descriptor de archivo, luego lo bloquea usando ese descriptor de archivo. Si el bloqueo es exitoso, luego se inicia para abrir, escribir y cerrar el archivo .lock9 . Posteriormente, desbloquea y cierra el $('#g-foo').siblings('.bar')0 .

Ahora he hecho lo mismo en el lado expressjs de las cosas:

  $('#g-foo').siblings('.bar')111  

Como puede ver, he anidado el código dentro de las devoluciones de llamada de las funciones de ASYNC:

  • $('#g-foo').siblings('.bar')2 está dentro $('#g-foo').siblings('.bar')3 CallBack
  • $('#g-foo').siblings('.bar')4 está dentro $('#g-foo').siblings('.bar')5 CallBack
  • $('#g-foo').siblings('.bar')6 $('#g-foo').siblings('.bar')7 están dentro de $('#g-foo').siblings('.bar')8 CallBack

No sé si esta es la forma adecuada de hacer las cosas porque es la primera vez que lo hace.
No sé si está bien o no usar $('#g-foo').siblings('.bar')9 y <div> <p id="p-foo"></p> <p class="bar"></p> </div> <svg> <g id="g-foo"></g> <g class="bar"></g> </svg> 0 para abrir y cerrar el archivo de bloqueo y hacer que las otras funciones sean asíncronos ( 99887776621 , <div> <p id="p-foo"></p> <p class="bar"></p> </div> <svg> <g id="g-foo"></g> <g class="bar"></g> </svg> 2 ).
¿Debo haber utilizado el ASYNC <div> <p id="p-foo"></p> <p class="bar"></p> </div> <svg> <g id="g-foo"></g> <g class="bar"></g> </svg> 3 y luego anule el código en su devolución de llamada y finalmente use el ASYNC <div> <p id="p-foo"></p> <p class="bar"></p> </div> <svg> <g id="g-foo"></g> <g class="bar"></g> </svg> 4 ?

¿Cómo cambia el código anterior si tengo que escribir dos archivos en el mismo <div> <p id="p-foo"></p> <p class="bar"></p> </div> <svg> <g id="g-foo"></g> <g class="bar"></g> </svg> 525 manejador?
¿Tendré que hacerlo todo sincrónico?

Original en ingles

I have a simple interface that takes some input values, sends them through an AXIOS post to an ExpressJS server which writes them to a file. That same file gets checked for new values at a random interval of times by another piece of C++ software.
The way I've went was to create .lock files associated with the .txt files that I want to read/write.
So the C++ opens the .lock file to get a file descriptor, then it locks it using that file descriptor. If the lock is succesfull then it proceeds to open, write and close the .txt file. Afterwards it unlocks and closes the .lock.

Now I have done the same thing on the ExpressJS side of things:

app.post("/dhcpIP", function(req, res) {   if (req.body.constructor === Object && Object.keys(req.body).length === 0) {     return res.status(500).send("ERROR: Inputs are empty !");   }    let fileText = req.body;   console.log("fileText: ");   console.log(fileText);    const dhcpcd_lock = fs.openSync(dhcpcd_lock_path, "w+");    flock(dhcpcd_lock, "ex", (err) => {     if (err) return console.error("Could not lock file.");      console.log("dhcpcd_lock is locked.");      const write_to_file = fileText;     fs.writeFile(       path.join(configFilesLocation, "/configuration.txt"),       write_to_file,       (error) => {         if (error) return console.error(error);         console.log("configuration.txt was saved");          flock(dhcpcd_lock, "un", (error) => {           if (error) return console.error(error);                      console.log("File is unlocked.");           res.sendStatus(200);            fs.closeSync(dhcpcd_lock);         });       }     );   }); }); 

As you can see I've nested the code inside the callbacks of the async functions:

  • fs.writeFile() is inside flock('ex') callback
  • flock('un') is inside fs.writeFile() callback
  • res.sendStatus(200); and fs.closeSync(dhcpcd_lock); are inside flock('un') callback

I don't know if this is the proper way of doing things because it's my first time doing this.
I don't know if it's OK or not to use openSync and closeSyncto open and close the lock file and have the other functions be asynchronous (flock, fs.writeFile).
Should I have used the async open and then nested the code in its callback and finally use the async close ?

How does the above code changes if I have to write two files in the same app.post() handler ?
Will I have to do it all synchronous ?

           

Lista de respuestas


Relacionados problema

1  Punto muerto y condición de raza en la implementación MUTEX  ( Deadlock and race condition in mutex implementation ) 
Estoy tratando de implementar un mutex en C usando la instrucción del ensamblaje atómico "BTS" para establecer un bit A atemicamente y devolver el valor origi...

10  ¿Cómo hacer que los eventos progresivos de los trabajadores de fondo se ejecuten en secuencia?  ( How to make backgroundworker progresschanged events execute in sequence ) 
Considere el siguiente código: private static BackgroundWorker bg = new BackgroundWorker(); static void Main(string[] args) { bg.DoWork += bg_DoWork; ...

0  ¿Cómo encontrar métodos de rubí duplicados con el mismo nombre pero un código diferente?  ( How to find duplicated ruby methods with the same name but different code ) 
La base de códigos de rubí grande con el que estoy trabajando tiene muchas instancias de métodos duplicados definidos con el mismo nombre, pero algunos de su ...

4  Condición de la carrera incluso cuando se usa sync.mutex en Golang  ( Race condition even when using sync mutex in golang ) 
El código completo está aquí: https://play.golang.org/p/gguoxxcv5m public enum Countries { USA, Canada, Mexico, } 2 dice que hay una condición ...

0  Error PHP / SQL: ¿Posible condición de raza?  ( Php sql error possible race condition ) 
Soy un novato en la programación con Ajax y principiante en la programación PHP. No estoy seguro de por qué, pero cuando un usuario hace clic en una flecha pa...

18  Condición de la carrera y el uso de Google Analytics Asynchronous (_GAQ) de forma sincrónica  ( Race condition and using google analytics asynchronous gaq synchronously ) 
Tengo un sitio web que está utilizando el método de seguimiento asíncrono de Google Analytics (_Gaq). El problema con el que he encontrado es que quiero insti...

1  C: Sincronización de hilo usando PTHEADS, bloqueo y desbloqueo MUTEX  ( C thread synchronization using pthreads locking and unlocking mutex ) 
Estoy trabajando en un proyecto más grande que incluye dos hilos, donde se comparte una base de datos entre ellos. Un trabajo de hilos es simplemente contar t...

2  Tenedor - ¿Cómo asegurar que los padres se ejecuten primero?  ( Fork how to ensure parent runs first ) 
Así que estoy escribiendo una concha de UNIX en C, y he estado encontrando una condición de carrera. He determinado que puedo resolverlo si, después de una de...

2  Condición de la raza nombrando instancias EC2  ( Race condition naming ec2 instances ) 
Estamos teniendo un problema de condición de raza mientras generamos nombres para nuestras instancias de EC2 de escala automática. Para cada instancia en un...

3  Sincronizar la ejecución del script shell  ( Synchronize shell script execution ) 
Una versión modificada de una shell script Convierte un archivo de audio de FLAC a Formato MP3. La computadora tiene una CPU de cuatro núcleos. El script se...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos