如何检测用户何时按下电源关闭按钮?

时间:2012-12-24 21:21:45

标签: c++ c linux power-management

我有一个运行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

3 个答案:

答案 0 :(得分:5)

您可以启动一个线程来读取/proc/events/acpi,并解码那里的消息。

但是如何使用acpid来做到这一点呢?你会听/var/run/acpid.socket,当你关心的消息进来时,做你做过的事。

请参阅: http://www.linuxmanpages.com/man8/acpid.8.php

我希望这很有用。

答案 1 :(得分:2)

查看acpid,我认为您可以更改/etc/acpi/中的一个特定/etc/acpi/powerbtn.sh脚本以添加自定义命令。您也可以尝试自己阅读/proc/acpi/event

答案 2 :(得分:2)

按下电源按钮会触发ACPI事件,这些事件会响应按照/ etc / acpi / events中的配置触发脚本。在这种情况下,您需要/ etc / acpi / powerbtn,它看起来像这样:

event=button[ /]power
action=/etc/acpi/powerbtn.sh

您可以自定义/etc/acpi/powerbtn.sh,也可以将其指向您选择的其他脚本。