我有一个运行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)吗? –