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

时间:2017-06-02 05:05:58

标签: c++ ln

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

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

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

任何想法?

2 个答案:

答案 0 :(得分:4)

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

顺便说一句,由于system(3)问题,谨慎使用code injection会很危险。想象一下,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 function(在Linux上将调用  symlink(2))。它可能受Boost filesystem库的启发。

PS。如果编写Linux或POSIX,我建议阅读 Advanced Linux Programming (可免费下载)。但是如果你想要一个源可移植的Qt程序,那么你可以将自己限制在慷慨的Qt API中。或者采用C ++ 17并使用它的std::filesystem

答案 1 :(得分:1)

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

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

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