执行c函数中的系统命令,并将控制返回到main
我正在从我的c函数执行LSF和Perl文件(它们具有与测试用例自动化相关的特定函数)。我想执行system()命令,不想等到文件的执行过程完成,而是想让控件返回到主c程序,继续执行程序,让任务由linux执行引擎执行。有人能帮我吗 我已附上以下代码:执行c函数中的系统命令,并将控制返回到main,c,C,我正在从我的c函数执行LSF和Perl文件(它们具有与测试用例自动化相关的特定函数)。我想执行system()命令,不想等到文件的执行过程完成,而是想让控件返回到主c程序,继续执行程序,让任务由linux执行引擎执行。有人能帮我吗 我已附上以下代码: sprintf(String, "/home/teproj/nxp90884/CellDesign/AN_DFIIToCdl.lsf %s %s %s %s %s", res, cel, tmp, frc, upd); system(String
sprintf(String, "/home/teproj/nxp90884/CellDesign/AN_DFIIToCdl.lsf %s %s %s %s %s", res, cel, tmp, frc, upd);
system(String);
您可以
fork
并在子进程中调用execve
系统调用,继续父进程中的原始作业(反之亦然)要在后台运行任务,您需要启动一个新线程fork()
是一个朋友,pthread
家族是另一个朋友
使用fork
的示例:
process = fork();
if (process < 0){
//fork error
perror("fork");
exit(EXIT_FAILURE);
}
if (process == 0){
// Child process. You can either use one of the exec functions:
execl("/home/teproj/nxp90884/CellDesign/AN_DFIIToCdl.lsf" "AN_DFIIToCdl.lsf", res, cel, tmp,frc,upd, NULL);
// or system + exit.
sprintf(String, "c %s %s %s %s %s", res, cel, tmp, frc, upd);
system(String);
exit(0); // to terminate the child.
} else {
// Main thread. Continue executing
}
process=fork();
如果(进程<0){
//分叉错误
佩罗尔(“福克”);
退出(退出失败);
}
如果(进程==0){
//子进程。您可以使用以下exec函数之一:
execl(“/home/teproj/nxp90884/CellDesign/AN_dfitocdl.lsf”“AN_dfitocdl.lsf”,res,cel,tmp,frc,upd,NULL);
//或系统+退出。
sprintf(字符串,“c%s%s%s%s%s”、res、cel、tmp、frc、upd);
系统(字符串);
退出(0);//终止子项。
}否则{
//主线程。继续执行
}
最佳做法是在这种情况下选择一个exec函数。由于system()
派生一个shell来运行命令行,因此您只需在命令行中附加一个符号(&
)即可使shell在后台运行命令
这是一种又快又脏的方法。干净的方法当然是自己进行流程管理,使用
fork()
和exec()
调用。您应该使用snprintf
,而不是sprintf
您的问题是操作系统特有的。在Linux上,阅读并学习如何使用、等…否;无需在child中使用fork
和调用system
,但在child中使用fork
和调用execve
!这是一个很好的破解,但是如果主要功能实际上是后台进程,而OP试图执行的命令是交互式的呢?