bash e c - 2 processos em simultaneidade para gravar um arquivo

2

Eu fiz um programa em C, ele bifurca 2 processos e cada um deles usa

 system()

para chamar 2 scripts (script1.sh e script2.sh), o que eu quero fazer é deixá-los escrever em um arquivo (output.txt) em paralelo, mas em momentos diferentes. Por enquanto meu script1.sh (do processo P1) escreve no arquivo primeiro, e então script2.sh (do processo P2) escreve no mesmo arquivo, mas eu preciso que eles escrevam desta maneira:

time 1: P1 writes 2 words in "output.txt" 
time 2: P2 wirtes 3 words in "output.txt" 
time 3: P1 writes 1 word in "output.txt" 
time 4: P2 writes 6 words in "output.txt" etc...

Eu sei que

 system()

a função é síncrona, mas eu consegui torná-la assíncrona usando

 system("script1.sh &")

O problema é que eu não sei como fazer isso, porque se P1 chama script1.sh com "& amp;" ele executa durante o P2 sem pausas, então não é isso que eu quero. Eu também sei como parar o P1 usando

 pkill -f "script1.sh

então talvez ajude eu não sei.

Como posso alcançar esse objetivo? Obrigado

    
por Frank 05.02.2013 / 18:20

2 respostas

2

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:

  1. "saída" - o arquivo real
  2. "output.script1" - o nome do arquivo que se destina ao script 1 para gravar
  3. "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:

  1. 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.
  2. Inicie os scripts em segundo plano. (chamada de sistema que você tem)
  3. Renomeie o arquivo "output" para "output.script1" e o script 1 irá buscá-lo.
por Neil Huang 21.03.2013 / 09:53
0

Talvez você possa decifrar o GNU Parallel e redirecionar a saída para o arquivo:

system("(echo script1.sh; echo script2.sh) | parallel > output.txt");
    
por Ole Tange 06.07.2014 / 23:04