为什么这些' xset'在Raspberry Pi Raspbian的C程序中使用system()工作的命令?

时间:2016-07-27 02:23:39

标签: c bash system raspbian

我正在运行Raspberry Pi运行Raspbian,我正在尝试编写一个C程序,通过使用超声波传感器关闭和打开显示器。我通过Bash手动使用这些命令获得了我想要的行为:

#First, I export the display variable
export DISPLAY=:0.0

#To turn off the monitor:
sudo /opt/vc/bin/tvservice -o

#To turn on the monitor:
sudo /opt/vc/bin/tvservice -p
xset dpms force on

我想通过使用system()函数从我的C程序中执行这些,但是我遇到了xset命令的问题。

system("echo $DISPLAY");
system("export DISPLAY=:0.0");
system("sudo /opt/vc/bin/tvservice -p && xset dpms force on");

给出输出:

:0.0
Powering on HDMI with preferred settings
No protocol specified
xset: unable to open display ":0.0"

即便如此:

system("xset -q");

返回:

xset: unable to open display ":0.0"

我见过几个人建议使用system()函数执行xset命令的例子,就像我试图做的那样,并且没有人看到其他人提到过这些完全相同的问题。还应该注意到我通过PuTTY访问Pi。我甚至不确定我的问题是由于对xset,system()函数或其他东西的误解引起的。任何线索都很感激!

更新了问题

一个重要的事情是system每次调用它时实际上都会使用一个新的shell,因此即使设置DISPLAY变量已经生效,它也不会影响下一次调用`系统'

这帮助我了解system实际上是如何工作的,并相信它应该像我使用它一样工作。所以我直接在Pi上运行我的C程序,而不是通过SSH,它实际上工作正常。就我目前的目的而言,我的问题得到了有效解决,因为我实际上并不需要通过SSH工作。

我想知道为什么我遇到了问题,而且我认为这主要与不了解X窗口系统有关。我会更多地阅读这一点,但如果有人提示让我找到我的特定问题的根源,我将不胜感激。目前我怀疑与X转发有关...

1 个答案:

答案 0 :(得分:1)

system的不同调用将运行shell的不同版本。它们彼此独立,特别是设置一个环境变量根本就没有意义:system呼叫结束后效果就结束了。

从我可以看到的所有内容中,您的代码在C语言中实现起来没什么意义。最好使用shell脚本。