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

标签 c++ c linux power-management

我有一个运行 Ubuntu 12.4.1 的街机鸡尾酒柜(没有键盘,只有一个操纵杆和按钮),当按下电源按钮时会出现一个弹出窗口并且系统正常关闭,但是当我的全屏游戏启动器菜单应用程序正在运行,然后按下按钮无效。我想在按下按钮时捕获事件,以便我的应用程序可以触发系统关闭。我的菜单应用程序是用 C++ 编写的,并且使用的是 SDL。关于如何捕获电源关闭按钮按下事件的任何想法?

感谢那些回复的人,这是我用来让它工作的实际代码:

类(class)成员:

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

最佳答案

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

但是如何使用 acpid 来做到这一点呢?您将收听 /var/run/acpid.socket,当收到您关心的消息时,执行您必须执行的操作。

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

我希望这是有用的。

关于c++ - 如何检测用户何时按下电源关闭按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14025794/

相关文章:

c - char 数和 int 数的大小(以字节为单位)

C. ASCII 十六进制值数组的校验和计算

python - 树莓派 : How can I kill an auto-started Tkinter UI?

c++ - 用flex和bison解析压缩文件?

c - 进程之间的管道链

c++ - 如何在openCV C++上填充圆圈

linux - 从 Linux 用户空间实现 i2c

linux - 配置 NGINX 时如何使用环境变量作为前缀路径?

c++ - 我如何检查一个条件是否已持续 5 秒?

c++ - 字符字符串数组的初始化程序中的问题