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