2013-08-01 64 views
2

嗨我想在matlab中運行一個進程xfoil。問題是有時xfoil崩潰,所以繼續沒有問題,我需要運行它作爲後臺進程。然而,現在我最終遇到了一個競爭條件,即xfoil在數據需要時尚未完成。爲了解決這個問題,我添加了一個暫停語句,但是在很多情況下,暫停時間太長。我想要做的是在啓動時記錄進程id,然後在while循環中檢查進程是否仍然存在。對於windows,這是這樣完成的。取消由matlab啓動的unix進程

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) 

但是,進程ID不會在pid或dump.out中返回。任何人都可以幫助解決這個問題。 謝謝。

+0

stat呢?有什麼嗎? –

+0

Nope stat = 0,pid ='' – wookie1

+0

根據'man','pidof'返回_running_程序的'pid'。你如何開始你的程序? – 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命令的進程ID。

相關問題