gpt4 book ai didi

c++ - 使用 system() 从 cpp 程序调用 ln

转载 作者:搜寻专家 更新时间:2023-10-31 00:28:39 25 4
gpt4 key购买 nike

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

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

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

有什么想法吗?

最佳答案

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

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


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

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

C++ 的 future (或最新)版本,从 C++17 开始, 将提供 std::filesystem::create_symlink function (在 Linux 上会调用 symlink(2) ).这可能是受 Boost filesystem 的启发图书馆。

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

关于c++ - 使用 system() 从 cpp 程序调用 ln,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44321177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com