我有一個運行Ubuntu 12.4.1的街機雞尾酒櫃(沒有鍵盤,只是一個操縱桿和按鈕),當按下電源按鈕時彈出窗口,系統關閉,但是當我的全屏遊戲啓動菜單應用程序正在運行,然後按下按鈕不起作用。我想在按下按鈕時捕獲事件,以便我的應用程序可以觸發系統關閉。我的菜單應用程序是用C++編寫的,正在使用SDL。關於如何將電源關閉按鈕按下事件的任何想法?如何檢測用戶何時按下了關機按鈕?
感謝那些回答,下面是實際的代碼,我用得到它的工作:
類成員:
int m_acpidsock;
sockaddr_un m_acpidsockaddr;
設置代碼:
/* Connect to acpid socket */
m_acpidsock = socket(AF_UNIX, SOCK_STREAM, 0);
if(m_acpidsock>=0)
{
m_acpidsockaddr.sun_family = AF_UNIX;
strcpy(m_acpidsockaddr.sun_path,"/var/run/acpid.socket");
if(connect(m_acpidsock, (struct sockaddr *)&m_acpidsockaddr, 108)<0)
{
/* can't connect */
close(m_acpidsock);
m_acpidsock=-1;
}
}
更新代碼:
/* check for any power events */
if(m_acpidsock)
{
char buf[1024];
int s=recv(m_acpidsock, buf, sizeof(buf), MSG_DONTWAIT);
if(s>0)
{
buf[s]=0;
printf("ACPID:%s\n\n",buf);
if(!strncmp(buf,"button/power",12))
{
setShutdown();
system("shutdown -P now");
}
}
}
關閉套接字代碼:
if(m_acpidsock>=0)
{
close(m_acpidsock);
m_acpidsock=-1;
}
最後,我需要讓非root用戶關機並且使用該行的工作:
sudo chmod u+s /sbin/shutdown
不,但這聽起來很酷! –
connect()調用中的數字108是什麼?它不應該是sizeof(m_acpidsockaddr)嗎? –