在 Linux 或 Mac 中是不是有与 getprop/setprop 类似的命令?

Posted

技术标签:

【中文标题】在 Linux 或 Mac 中是不是有与 getprop/setprop 类似的命令?【英文标题】:Is there similar commands to getprop/setprop in Linux or Mac?在 Linux 或 Mac 中是否有与 getprop/setprop 类似的命令? 【发布时间】:2021-12-06 02:56:50 【问题描述】:

我想知道android中是否存在与getprop/setprop类似的命令。

我希望能够对已编译应用的某些属性进行更改,而无需再次编译。

我知道在 Android 上我可以使用 adb shell setprop 这样做,但我没有在 Linux/Mac 中找到类似的东西。

有一种方法可以在 Linux 上使用环境变量执行类似的操作(在 Mac 上可能相同),但还有其他方法吗?

我将举例说明我想做的事情: 假设我有一个程序使用默认线程数进行并行化,并且我不会在编译后更改线程数。 我可以通过添加一个环境变量来做到这一点,在我的会话中设置它然后运行我的应用程序。

以下代码演示了这一点:

#include <sstream>
#include <cstdlib>

template <class T>
bool getEnv(const char* envVariable, T& value) 
    auto envValue = getenv(envVariable);
    if (!envValue) 
        return false;
    
    if constexpr (std::is_same_v<T, int>) 
        auto tempValue = strtol(envValue, nullptr, 10);
        if (tempValue < std::numeric_limits<int>::min() ||
             tempValue > std::numeric_limits<int>::max()) 
            return false;
        
        value = tempValue;
     else if constexpr  (std::is_same_v<T, double>) 
        auto tempValue = strtod(envValue, nullptr);
        if (tempValue < std::numeric_limits<double>::min() || 
             tempValue > std::numeric_limits<double>::max()) 
            return false;
        
        value = static_cast<double>(tempValue);
     else 
        // make sure this won't compile
        static_assert(!std::is_same_v<T, T>);
    
    return true;


int main() 
    int number_of_threads;
    int status = getEnv("NUMBER_OF_THREADS", number_of_threads);
    if (!status) 
        std::cerr << "Failed to get NUMBER_OF_THREADS\n";
        return 1;
    
    std::cout << "NUMBER_OF_THREADS=" << number_of_threads << "\n";

    return 0;

在终端上:

idancw:~/envTest/cmake-build-debug> export NUMBER_OF_THREADS=4
idancw:~/envTest/cmake-build-debug> ./test 
NUMBER_OF_THREADS=4
idancw:~/envTest/cmake-build-debug> export NUMBER_OF_THREADS=10
idancw:~/envTest/cmake-build-debug> ./test                     
NUMBER_OF_THREADS=10

还有其他不使用 env 变量的方法吗,类似于 Android?

我怀疑我也可以在 Mac 上使用 env 方法,但还有别的吗?

谢谢:)

【问题讨论】:

其他流行的选项是配置文件和命令行参数。 我对这些很熟悉,但我想像 Android 一样使用 getprop/setprop 使其变得简单 【参考方案1】:

为了回答最初的问题,让我们看看 getprop / setprop 在 Android 上究竟做了什么。

例如,从here 我们知道,getprop / setprop 只是用于读取和写入某些数据库的 API,存储在文件系统上的文件中。该 API 由名为“property_service”的系统进程管理。

所以我们可能想要的品质是:系统范围的、可通过一些本机 API 访问的、持久性数据库。由于本机 API 在需求列表中,我们可以预测不会有开箱即用的跨平台解决方案 :)

在 Windows 上,我会说它听起来像注册表。它定义存储在文件系统中,有 WinAPI 可以访问或更改它,并且它会持续重启。

在 macOS 上,我能想到的最接近的东西是 NSUserDefaults。

对于 linux afaik,没有针对所有发行版的统一解决方案,但是有很多地方可以存储和读取文件系统中的参数,广泛discussed。

【讨论】:

以上是关于在 Linux 或 Mac 中是不是有与 getprop/setprop 类似的命令?的主要内容,如果未能解决你的问题,请参考以下文章

WatchKit 中是不是有与 UIView 等效的类?

如何在 Mac OS 中修改文件系统缓存的行为

CORBA 中是不是有与 writeReplace 等价的方法?

插件中是不是有与 Bootstrap 类等效的类

Blazor 中是不是有与 Html.Raw 等效的内容?

Qt 中是不是有与 MFC OnUpdate 等效的功能?