使用System()从CPP程序中调用LN

using system() to call ln from a cpp program

本文关键字:程序 调用 LN CPP System 使用      更新时间:2023-10-16

我试图通过以下命令从CPP程序调用系统

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

targetDir和基于基础的QStringList。程序编译并运行,但是当我执行命令时,我会得到错误ln:targetDir [0]是无效的命令。当我通过硬编码值而不是使用变量测试时,它可以正常工作。我只能得出结论,它不会逃脱字符串,以将变量的值放置在传递给LN的参数。对于我的一生,我不知道为什么不。

有什么想法?

您感到困惑。系统(3(库函数(不是命令,尽管它的名称不是 一个系统调用,但这些命令在syscalls(2(中列出了这些调用/bin/sh -c的过程显然对C 程序的变量不了解(在运行时,变量不存在;只有位置(。

顺便说一句,由于注入代码注入问题,使用系统(3(可能会很危险。想象一下您(错误的(方法targetDir[0]包含foo; rm -rf $HOME ....

之类的东西

要建立符号链接,分叉一个过程是过分的。只需调用Symlink(2(系统调用(如果被调用为ln -s,则ln(1(命令将调用该命令

QT库提供QFILE类,其QFILE ::链接成员函数或静态QFILE :: link(两者都将调用SymLink(2((

从C 17开始的C 的Future(或最新(版本将提供std::filesystem::create_symlink功能(Linux上将调用 Symlink(2((。它可能受到Boost Filesystem库的启发。

ps。如果编码Linux或Posix,我建议阅读高级Linux编程(可自由下载(。但是,如果您希望一个可源的QT程序将自己限制在慷慨的QT API中。或采用C 17并使用其std::filesystem事物。

c 绝不执行字符串插值。

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

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