您好我正试图在这种情况下从matlab运行一个进程xfoil。问题是有时xfoil崩溃所以继续没有问题我需要将它作为后台进程运行。但是现在我最终遇到了竞争条件,即xfoil在需要数据时尚未完成。为了解决这个问题,我添加了一个暂停语句,但在很多情况下暂停时间过长。我想要做的是在启动时记录进程ID然后在while循环中检查进程是否仍然存在。 对于Windows,这是完成的。
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中都不会返回进程ID。任何人都可以帮助解决这个问题。 感谢。
答案 0 :(得分:1)
据我所知,你在这里犯了一个错误。 这条线
run_xfoil_command='pidof xfoil < foilcommands > dump.out &';
必须是
run_xfoil_command='pidof xfoil > foilcommands > dump.out &';
pidof返回命令xfoil的进程id,它可以存储在foilcommands中。
答案 1 :(得分:1)
正如我在评论中所说,pidof
只获得正在运行的程序的pid
。如果命令xfoil
是运行程序的原因,那么您应该尝试
xfoil < foilcommands &; /sbin/pidof xfoil > dump.out
然后检查dump.out
的内容。我想你的pid
会在那里......