2013-08-01 4 views
2

Привет Я пытаюсь запустить процесс xfoil в этом случае из matlab. Проблема в том, что иногда xfoil падает, поэтому для продолжения без проблем мне нужно запустить его как фоновый процесс. Однако теперь я заканчиваю условие гонки, когда xfoil не закончил к тому времени, когда данные необходимы. Чтобы решить эту проблему, я добавил оператор паузы, но во многих случаях пауза слишком длинная. То, что я хотел бы сделать, это записать идентификатор процесса при запуске в течение цикла while, если процесс все еще существует. Для окон это выполняется так.Отмена процесса unix, начатого matlab

elseif(ispc) 
    run_xfoil_command='start /b xfoil.exe <foilcommands> dump.out'; 
    [~,~] = system(run_xfoil_command); 
    tic; 
    % While xfoil hasn't finished running 
    while (system('tasklist /FI "IMAGENAME eq xfoil.exe" 2>NUL | find /I /N "xfoil.exe">NUL')==0) 
     if (toc>5) 
      [~,~] = system('taskkill /F /IM xfoil.exe > dump1.out'); 
      break 
     end 
     pause(0.2); 
    end 
    [~,~] = system('taskkill /F /IM cmd.exe > dump1.out'); 
end 

Однако я не могу понять, как это сделать в Linux. Я пробовал;

if(isunix) 
    run_xfoil_command='pidof xfoil <foilcommands> dump.out &'; 
    setenv('GFORTRAN_STDIN_UNIT', '5') 
    setenv('GFORTRAN_STDOUT_UNIT', '6') 
    setenv('GFORTRAN_STDERR_UNIT', '0') 
    tic; 
    [stat,pid] = unix(run_xfoil_command) 

Однако идентификатор процесса не возвращается ни в pid, ни в dump.out. Может ли кто-нибудь помочь решить эту проблему. Спасибо.

+0

Что относительно stat? Что-нибудь там? –

+0

Nope stat = 0, pid = '' – wookie1

+0

По словам 'man',' pidof' возвращает 'pid' программы _running_. Как начать свою программу? – Floris

ответ

1

Как я сказал в своем комментарии, pidof получает только pid запущенной программы. Если команда xfoil является то, что получает вашу программу, вы должны попробовать

xfoil < foilcommands &; /sbin/pidof xfoil > dump.out 

Затем проверьте содержимое dump.out. Я думаю, что ваш pid будет там ...

1

Насколько я знаю, вы делаете здесь только одну ошибку. линия

run_xfoil_command='pidof xfoil <foilcommands> dump.out &'; 

должен быть

run_xfoil_command='pidof xfoil > foilcommands > dump.out &'; 

pidof возвращает идентификатор процесса команды xfoil, которые могут быть сохранены в foilcommands.