2016-07-27 1 views
-2

Я работаю над малиной Pi, работающей на Raspbian, и пытаюсь написать программу C, чтобы выключить и включить монитор с помощью ультразвукового датчика. Я получаю поведение, я хочу с помощью этих команд вручную из Bash:Почему эти команды «xset» работают из системы() в программе C на Raspberry Pi Raspbian?

#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 

Я хочу, чтобы выполнить это из моей программы 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" 

Я видел несколько примеров людей, предполагая использование системы() функция для выполнения команд xset как я пытаюсь сделать, и не видел, чтобы кто-то еще упоминал об этих одинаковых проблемах. Следует также отметить, что я обращаюсь к Pi через PuTTY. Я даже не уверен, что мои проблемы возникают из-за непонимания xset, функции system() или чего-то еще. Любые ссылки оцениваются!

Обновленный вопрос

Одна важная вещь, отметил, что system фактически использует новую оболочку каждый раз, когда он вызывается, так что даже если установка DISPLAY переменная была продуктивной, она не будет иметь никакого эффекта на следующем вызове «системы».

Это помогло мне понять, как работает system, и полагать, что он должен работать так, как я его использовал. Поэтому я запускал свою программу на C непосредственно на Pi, а не через SSH, и на самом деле это работает нормально. Для моих текущих целей моя проблема эффективно решена, потому что мне действительно не нужно работать через SSH.

Я действительно хочу знать, почему у меня были проблемы, которые у меня были, и я думаю, что это связано главным образом с непониманием системы окон X. Я прочитаю об этом больше, но если у кого-то есть намек, чтобы привести меня в корень моей конкретной проблемы, я был бы признателен. В настоящее время я подозреваю, что что-то связано с X переадресацией ...

+1

Выполнение команд с системой - это не то же самое, что вводить их в сеанс интерактивной оболочки. –

ответ

1

Различные призывы system будут запускать различные воплощения вашей оболочки. Они независимы друг от друга и, в частности, устанавливают переменную окружения, не имеют никакого смысла: эффект заканчивается, как только заканчивается вызов system.

Из всего, что я вижу, ваш код не имеет особого смысла для реализации на C. Вам лучше со сценарием оболочки.

+0

Ah OK Я не понимал, что каждый вызов 'system' является таким независимым, спасибо. Что касается использования сценария оболочки вместо C: мне нужно использовать контакты GPIO, и я уже знаком с использованием для этого библиотек wiringPi. Каковы были бы преимущества использования сценария оболочки? Это вообще плохая идея по какой-то причине использовать 'system'? –

Смежные вопросы