【发布时间】:2015-07-27 14:01:20
【问题描述】:
我有一个无限期运行的程序。出于测试目的,我制作了一个包装程序,该程序在指定的时间后杀死另一个(通过命令行/终端参数指定)。被分叉的程序要求它传递两个具有相同名称的文件夹(我无法控制),所以我只需将相同的 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
【问题讨论】:
-
您要执行的确切命令行是什么?
-
test数组应该以可执行文件的名称开头并以 NULL 结尾。 -
它应该以文件名开头,但这只是为了约定。
-
使用strace(1) -as
strace -f了解正在发生的事情 -
您应该至少有一个
exit()调用,并且最好在execvp()之后打印一条错误消息。它仅在失败时返回,但您不希望孩子在失败时继续做其他事情。