【问题标题】:How to change system date and time(embedded Linux) using QML?如何使用 QML 更改系统日期和时间(嵌入式 Linux)?
【发布时间】:2018-01-05 06:11:30
【问题描述】:

如何在 QML 中更改系统时间和日期?我认为这可能从一个例子中起作用,尽管我怀疑对象被发送到哪里。它没有用。有人可以告诉我怎么做吗?以下是我的代码:

  var time = new Date()
  time.setHours(hour)
  time.setMinutes(minute)
  time.setSeconds(secs)

【问题讨论】:

  • 闻起来很像XY problem。请编辑您的问题以改进它并给出真正的动机和背景。你有什么样的应用程序?如果您开发一些嵌入式系统,请说出并解释它是什么系统......

标签: linux qt datetime qml


【解决方案1】:

没有root权限一般是不能更改系统时间的,设置系统时间是系统管理员的全系统操作。请参阅 settimeofday(2)adjtimex(2)。另见credentials(7) & capabilities(7)

(所以这不是使用Qt或其他东西的问题;任何使用settimeofdayadjtimex的库都需要root权限)

另请阅读time(7)

而且你一般不应该改变系统时间,而是让一些守护进程使用NTP不断调整它。

你的代码只是改变了一些持有一段时间的变量的值。它不会改变系统时间。

系统管理员可以更改时间,例如date(1)-s 一起使用,这需要 root 权限并在内部使用 settimeofday。另见hwclock(8)

请注意,GUI 应用程序通常不应以 root 身份运行(Qt 或 GTK 也不希望以 root 身份运行)。

如果您开发一些嵌入式系统并且希望用户设置时间,您可以考虑编写一些 small 专用的 setuid 可执行文件,它使用 settimeofday(2) 并让您的 GUI 应用程序运行它(例如QProcess)。在编写 setuid 程序时要非常小心(所以请阅读 ALP 或一些关于 Linux 系统编程的好书),因为您很容易得到 vulnerabilities。请注意,setuid 是获取获取或更改权限。它使用起来很棘手,所以请花时间去理解它。

也许您的initsystemd 可能被配置为简化这样的任务......

(您需要更多地描述您的整个系统以获得更多帮助)

【讨论】:

  • 那用户怎么改呢?我正在 IMX6 平台上工作。
  • 用户不应更改它。你应该有一些使用 NTP 的守护进程。并且系统管理员可以更改它(例如,通过运行,作为 rootdate -s)。
  • 这是一个用户特定的应用程序,我不能在这里完全解释它(对此感到抱歉)。但是每部手机和 PC 都可以选择更改日期和时间,就像我可以让用户选择更改日期和时间一样,如果他/她想更改的话。如何在 QML/Javascript 中做到这一点?
  • 按照我的建议,编写您的专用 setuid 程序,然后从您的 Qt 应用程序中运行它。如果你不能解释你的申请,你不应该在 SO 上提问。
  • 顺便说一句,这主要是整个系统和系统管理员的问题。您的系统是否正在运行 systemd ?或者什么样的init程序?