编写内核配置时,“不是目录”

时间:2019-10-17 02:47:36

标签: c++ linux qt sysctl

我试图在Qt中使用此功能在Linux系统上切换IPv6。问题是它无法打开文件,而只是报告“不是目录”。

bool toggle_ipv6(const bool &enabled) {
    const std::vector<std::string> ipv6_kernel_option_files = {
        "/proc/sys/net/ipv6/conf/all/disable_ipv6"
        "/proc/sys/net/ipv6/conf/default/disable_ipv6"
        "/proc/sys/net/ipv6/conf/lo/disable_ipv6"
    };

    for (const auto &filename: ipv6_kernel_option_files) {
        QFile kernel_option_file( filename.c_str() );
        if ( kernel_option_file.open(QIODevice::WriteOnly) ) {
            QTextStream stream(&kernel_option_file);
            stream << (enabled ? "0" : "1");
            kernel_option_file.close();
        } else {
            const std::string error_message = kernel_option_file.errorString().toStdString();
            qDebug().nospace().noquote() << '[' << QTime::currentTime().toString() << "]: " << error_message.c_str();
            return false;
        }
    }

    return true;
}

我尝试搜索网络,但找不到与QFile和此特定错误消息有关的其他任何问题。我该如何解决?

1 个答案:

答案 0 :(得分:1)

向量初始化中缺少逗号:

const std::vector<std::string> ipv6_kernel_option_files = {
    "/proc/sys/net/ipv6/conf/all/disable_ipv6"
    "/proc/sys/net/ipv6/conf/default/disable_ipv6"
    "/proc/sys/net/ipv6/conf/lo/disable_ipv6"
};

因此,向量只有一个元素,它是由三个路径串联而成的字符串:

"/proc/sys/net/ipv6/conf/all/disable_ipv6/proc/sys/net/ipv6/conf/default/disable_ipv6/proc/sys/net/ipv6/conf/lo/disable_ipv6"

考虑到这一点

"/proc/sys/net/ipv6/conf/all/disable_ipv6"

是文件,而不是目录,它不能包含路径的其余部分。

使用逗号分隔向量初始化中的路径:

const std::vector<std::string> ipv6_kernel_option_files = {
    "/proc/sys/net/ipv6/conf/all/disable_ipv6",
    "/proc/sys/net/ipv6/conf/default/disable_ipv6",
    "/proc/sys/net/ipv6/conf/lo/disable_ipv6"
};