O que você pode fazer é um truque antigo do UNIX, que é o fato de que uma operação de renomeação de arquivos pelo menos em um sistema de arquivos padrão do UNIX é atômica.
Veja o que você pode fazer:
Tenha um único arquivo que está sendo gravado, digamos, saída. O nome do arquivo levaria 3 formas diferentes:
- "saída" - o arquivo real
- "output.script1" - o nome do arquivo que se destina ao script 1 para gravar
- "output.script2" - nome do arquivo criado para o script2 escrever.
Cada script terá um mecanismo para esperar por um arquivo e depois pegá-lo e escrever nele. Por exemplo, no script 1:
script1.sh:
function check_for_file {
local file=
if [[ -f "" ]];then
return 1
else
return 0
fi
}
function wait_for_file {
local file=
while (( 'check_for_file $file' == 0 ))
do
# sleep 1 second and check again
sleep 1
done
}
# MAIN
# pass 1:
wait_for_file "output.script1"
# got file now
echo "whatever you need to write for pass 1" >> output.script
# done with first write, pass file to second script
mv "output.script1" "output.script2"
wait_for_file
# pass 2: do what I need to do for pass 2
# ... etc
O mesmo mecanismo de script pode ser usado para o script 2. Apenas certifique-se de que no script 2 você o renomeie do script2.
Depois, tenha o seguinte:
- no seu programa em C, você pode criar o arquivo de saída primeiro e escrever o que precisar primeiro (por exemplo, fopen ("output", "w")). E escreva para ele se você precisar. Feche o ponteiro do arquivo.
- Inicie os scripts em segundo plano. (chamada de sistema que você tem)
- Renomeie o arquivo "output" para "output.script1" e o script 1 irá buscá-lo.