执行c函数中的系统命令,并将控制返回到main

执行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

我正在从我的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);

您可以
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试图执行的命令是交互式的呢?