使用 system() 从 cpp 程序调用 ln

using system() to call ln from a cpp program

我正在尝试使用以下命令从 cpp 程序调用系统

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

targetDir 和baseDir 都是QStringList。程序编译并运行,但是当我执行命令时出现错误 ln:targetDir[0] 是无效命令。当我通过对值进行硬编码而不是使用变量进行测试时,它工作得很好。我只能得出结论,它没有转义字符串以将变量的值放入传递给 ln 的参数中。对于我的生活,我无法弄清楚为什么不。

有什么想法吗?

你糊涂了。 system(3) library function (it is not a command, and despite its name is not a system call, those are listed in syscalls(2)) is forking 一个 /bin/sh -c 进程显然对你的 C++ 程序的变量一无所知(在运行时,变量不存在;只有位置)。

顺便说一句,使用 system(3) without care can be dangerous because of code injection 问题。想象一下,在您的(错误的)方法中 targetDir[0] 包含类似 foo; rm -rf $HOME ....

的内容

要创建一个符号 link,分叉一个进程是多余的。只需调用 symlink(2) system call (which the ln(1) 命令,如果调用为 ln -s)

Qt 库提供 QFile class with its QFile::link member function, or the static QFile::link (both will call symlink(2))

C++ 的未来(或最新)版本,从 C++17, will provide the std::filesystem::create_symlink function 开始(在 Linux 上将调用 symlink(2)). It is probably inspired by Boost filesystem图书馆。

PS。如果为 Linux 或 POSIX 编码,我建议阅读 Advanced Linux Programming (which is freely downloadable). But if you want a source-portable Qt program restrict yourself to the generous Qt API. Or adopt C++17 and use its std::filesystem 东西。

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

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

std::string command = std::string("ln -s -t \"") + targetDir[0] + "\" \"" + baseDir[0] + "\"";
system(command.c_str());