Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何检测用户何时按下了电源关闭按钮?_C++_C_Linux_Power Management - Fatal编程技术网

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

C++ 如何检测用户何时按下了电源关闭按钮?,c++,c,linux,power-management,C++,C,Linux,Power Management,我有一个街机鸡尾酒柜(没有键盘,只有一个操纵杆和按钮)运行Ubuntu12.4.1,当按下电源按钮时会出现一个弹出窗口,系统会很好地关闭,但当我的全屏游戏启动程序菜单应用程序运行时,按下按钮没有效果。我想在按下按钮时捕获事件,以便我的应用程序可以触发系统关闭。我的菜单应用程序是用C++编写的,并且使用SDL。关于如何捕捉断电按钮按下事件,有什么想法吗 感谢响应者,下面是我用来让它工作的实际代码: 班级成员: int m_acpidsock; sockaddr_un m_acpidsockaddr

我有一个街机鸡尾酒柜(没有键盘,只有一个操纵杆和按钮)运行Ubuntu12.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;
}
设置代码:

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;
}
关闭套接字代码:

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
,当您关心的消息传入时,请执行您必须执行的操作

见:


我希望这是有用的

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

按下电源按钮等操作会触发acpi事件,acpid会触发脚本以响应/etc/acpi/events中配置的事件。在本例中,您需要/etc/acpi/powerbtn,它看起来像这样:

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

您可以自定义/etc/acpi/powerbtn.sh,也可以将它指向您选择的另一个脚本。

不,但这听起来很酷!connect()调用中的数字108是什么?它不应该是sizeof(m_acpidsockaddr)吗?