2

I am trying to call system from a cpp program with the following command

system("ln -s -t \"targetDir[0]\" \"baseDir[0]\"");

Both targetDir and baseDir are QStringList. The program compiles and runs but when I execute the command i get the error ln : targetDir[0] is an invalid command. When I test by hard coding the values instead of using variables it works just fine. I can only conclude it is not escaping the string to put the value of the variables int the argument passed to ln. For the life of me I can't figure out why not.

Any Ideas?

4

2 回答 2

4

你很困惑。system(3)库函数(它不是命令,尽管它的名称不是系统调用,但它们在syscalls(2)中列出)正在分叉一个/bin/sh -c进程,该进程显然对你的变量一无所知C++ 程序(在运行时,变量不存在;只有位置)。

顺便说一句, 由于代码注入问题,不小心使用system(3)可能很危险。想象一下,在您的(错误的)方法中,其中包含...之类的东西。targetDir[0]foo; rm -rf $HOME


要建立符号链接,分叉一个进程是多余的。只需调用symlink(2)系统调用(如果调用为ln(1)ln -s命令将调用它)

Qt 库提供QFile类及其QFile::link成员函数,或静态QFile::link(两者都将调用symlink(2)

C++17开始的未来(或最近)版本的 C++将提供该std::filesystem::create_symlink函数(在 Linux 上将调用 symlink(2))。它可能是受到Boost 文件系统库的启发。

PS。如果为 Linux 或 POSIX 编码,我建议阅读Advanced Linux Programming(可免费下载)。但是,如果您想要一个源代码可移植的 Qt 程序,请限制自己使用慷慨的Qt API。或者采用 C++17 并使用它std::filesystem的东西。

于 2017-06-02T05:10:53.443 回答
1

C++ 绝不执行字符串插值。

如果您实际上是在用 C++ 编写,您可以(考虑targetDirischar **或类似的东西):

std::string command = std::string("ln -s -t \"") + targetDir[0] + "\" \"" + baseDir[0] + "\"";
system(command.c_str());
于 2017-06-02T05:12:37.613 回答