Я создал программу на 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 Как мне достичь этой цели? Спасибо
То, что вы можете сделать, это старый трюк UNIX, который заключается в том, что операция переименования файла, по крайней мере, в стандартной файловой системе UNIX, является атомарной.
Вот что вы можете сделать:
Иметь один файл, в который записывается, скажем, вывод. Имя файла будет иметь 3 различные формы:
Каждый сценарий будет иметь механизм для ожидания файла, а затем забрать его и записать в него. Например, в сценарии 1:
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.
Затем сделайте следующее:
Может быть, вы можете разветвить GNU Parallel и перенаправить вывод в файл:
system("(echo script1.sh; echo script2.sh) | parallel > output.txt");