我正在尝试执行类似于以下内容的文件:
./foo bar baz band
哪里
executable = "foo"
path_executable =" bar baz band"
我正在使用 snprintf 来连接,然后使用 execlp fork 一个进程
snprintf(final_executable, sizeof final_executable, "%s%s%s","./",executable,path_executable);
snprintf(for_execlp, sizeof for_execlp,"%s%s","./",executable);
这是我根据我之前的知识尝试过的。
我无法正确执行应用程序 foo
。
execlp(for_execlp,for_execlp,path_executable, (char *)0);
你能告诉我错误出在哪里吗?我被困在这里了!
在命令行上我需要执行以下命令:
./blackscholes 1 /parsec-3.0/pkgs/apps/blackscholes/run/in_10M.txt prices.txt
最佳答案
什么是final_executable
和for_execlp
?您将 sizeof Final_executable
作为大小参数传递给 snprintf()
,但 final_executable
可能是 char *
,因此 sizeof
将计算出指针的大小,而不是可用存储的大小。
您是否检查 snprintf()
调用的返回值?
此外,“无法正确执行应用程序 foo
”是什么意思?如果 execlp()
失败,返回值是什么?
根据http://pastebin.com/vyrxWWLK
上的代码进行更新:
好吧。因此,从 main()
中,您调用函数 run_apps("blackscholes","1/parsec-3.0/pkgs/apps/blackscholes/run/in_10M.txt rates.txt")
。在 run_apps()
中,您为字符串创建数组,因此 sizeof
是正确的。您使用 snprintf()
将 "/parsec/parsec-3.0/pkgs/apps/blackscholes/inst/arm-linux.gcc/bin/"
写入 path_to_executable
数组,以及 chdir()
。然后,您将 snprintf()
将字符串 "./blackscholes 1/parsec-3.0/pkgs/apps/blackscholes/run/in_10M.txt rates.txt"
写入 final_executable
数组,毫无意义,然后将字符串 "./blackscholes"
写入 for_execpl
数组,然后调用 execlp(for_execlp,for_execlp,path_executable, (char *)0);
,扩展为 execlp("./blackscholes","./blackscholes","1/parsec-3.0/pkgs/apps/blackscholes/run/in_10M.txt rates.txt", NULL);
。请注意,第一个(也是唯一的)命令行参数是“1/parsec-3.0/pkgs/apps/blackscholes/run/in_10M.txt rates.txt”
,这是您想要的吗?
但是,您没有检查 execlp()
的返回值,并且您仍然没有说出“无法正确执行应用程序 foo
”对您意味着什么...因此,虽然您的问题很可能如 Grijesh Chauhan 所指出的那样,但您只是错误地使用了execlp()
。但是,execlp()
实际上可能会失败,在这种情况下,您需要处理该潜在错误,而您的代码并未执行此操作。
关于c - Execlp - 路径修正,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17553261/