我正在运行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转发有关...
答案 0 :(得分:1)
system
的不同调用将运行shell的不同版本。它们彼此独立,特别是设置一个环境变量根本就没有意义:system
呼叫结束后效果就结束了。
从我可以看到的所有内容中,您的代码在C语言中实现起来没什么意义。最好使用shell脚本。