bash и c - 2 процесса одновременно для записи файла

Я создал программу на C, она разветвляется на 2 процесса, и каждый из них использует

 system()

для вызова 2 скриптов (script1.sh и script2.sh), и я хочу, чтобы они записывать в файл (output.txt) параллельно, но в разные моменты. На данный момент мой script1.sh (из процесса P1) сначала записывает в файл, а затем script2.sh (из процесса P2) записывает в тот же файл, но мне нужно, чтобы они писали таким образом:

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...

Я знаю, что функция

 system()

является синхронной, но мне удалось сделать ее асинхронной, используя

 system("script1.sh &")

. Проблема в том, что я не знаю, как это сделать, потому что, если P1 вызывает script1.sh с "& amp;" он выполняется во время P2 без пауз, так что это не то, что я хочу. Я также знаю, как остановить P1, используя

 pkill -f "script1.sh

, так что, возможно, это поможет, я не знаю.

1111 Как мне достичь этой цели? Спасибо

2
задан 5 February 2013 в 21:20

2 ответа

То, что вы можете сделать, это старый трюк UNIX, который заключается в том, что операция переименования файла, по крайней мере, в стандартной файловой системе UNIX, является атомарной.

Вот что вы можете сделать:

Иметь один файл, в который записывается, скажем, вывод. Имя файла будет иметь 3 различные формы:

  1. «output» - фактический файл
  2. «output.script1» - имя файла, который предназначен для записи сценария 1
  3. [ 114] "output.script2" - имя файла, предназначенное для записи script2.

Каждый сценарий будет иметь механизм для ожидания файла, а затем забрать его и записать в него. Например, в сценарии 1:

script1.sh:

function check_for_file {
    local file=$1
    if [[ -f "$1" ]];then
        return 1
    else
        return 0
    fi
}

function wait_for_file {
    local file=$1
    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

Тот же механизм сценария можно затем использовать для сценария 2. Просто убедитесь, что в сценарии 2 вы переименовали его из script2.

Затем сделайте следующее:

  1. в вашей C-программе вы можете сначала создать выходной файл и сначала написать все, что вам нужно (т.е. fopen («output», «w»)). И напишите ему, если нужно. Закройте указатель файла.
  2. Запустите сценарии в фоновом режиме. (системный вызов, который у вас есть)
  3. Переименуйте файл «output» в «output.script1», и сценарий 1 подберет его.
0
ответ дан 5 February 2013 в 21:20

Может быть, вы можете разветвить GNU Parallel и перенаправить вывод в файл:

system("(echo script1.sh; echo script2.sh) | parallel > output.txt");
0
ответ дан 5 February 2013 в 21:20

Другие вопросы по тегам:

Похожие вопросы: