我有一个可以无限期运行的程序。为了进行测试,我制作了一个包装程序,该程序在指定的时间(通过命令行/终端参数指定)后杀死另一个程序。被派生的程序要求将两个具有相同名称的文件夹传递给我(我对此无能为力),因此我只需将两次相同的arg传递给它,如下所示:

pid_t pid = fork();
if(pid == 0)
{
    //build the execution string
    char* test[2];
    test[0] = argv[2];
    test[1] = argv[2];
    test[2] = NULL;
    cout << "test[0] is " << test[0] << endl;
    cout << "test[1] is " << test[1] << endl;
    cout << "argv[1] is " << argv[1] << endl;
    execvp(argv[1],test);
}

问题在于在argv [1]中传递的程序使分段错误不断。如果我自己通过终端调用,则运行不会有问题。在两种情况下,我都传递相同的文件夹。谁能告诉我为什么它对execvp不起作用?

我应该提到一位同事也在他的计算机上运行了它,它第一次可以很好地站立,但是每次之后,它都会出现故障。

编辑:我添加了一个空项来测试,但是,这没有解决问题。

该命令的形式完全是:
<executable> <wrapped prog> <folder> <duration>

在相对路径中,它是:
Intel/debug/Tester.exe <program> test 10

最佳答案

如果数组的长度是静态的,那么使用以下方法可能会更好execlp

execlp(argv[1], argv[1], argv[2], argv[2], (char*)0);
至于execvp,该数组应以可执行文件的名称开头,并以NULL结尾。execvp
char* args[] = { argv[1], argv[2], argv[2], NULL };
execvp(argv[1], args);
runWithTimeout
无论如何,如果您只需要一个简单的包装程序,该包装程序运行一个带有超时的子进程,那么只要您愿意从timeout参数开始,您的程序就可以非常简单和通用:
/*runWithTimeout.c
  compile with: make runWithTimeout
  run with: ./runWithTimeout seconds program arguments...
*/
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>

int main(int argc, char** argv)
{
  assert(argc >= 1+2);
  int pid, status = 1;
  if((pid = fork()) == 0) {
    alarm(atoi(argv[1]));
    execvp(argv[2], argv + 2);
    /*^the child ends here if execvp succeeds,
    otherwise fall-through and return the default error status of 1
    (once in child (which has no one to wait on) and
    then in the parent (which gets the status from the child))*/
    perror("Couldn't exec");
  }else if(pid < 0){ perror("Couldn't fork"); };
  wait(&status);
  return status;
}

关于c++ - 意外的 fork 行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31655226/

10-11 21:55