2012-12-24 37 views
7

Tôi có một tủ cocktail arcade (không có bàn phím, chỉ cần một phím điều khiển và các nút) chạy Ubuntu 12.4.1, khi nút nguồn được nhấn một cửa sổ bật lên xuất hiện và hệ thống tắt tốt, nhưng khi ứng dụng trình khởi chạy trò chơi toàn màn hình của tôi đang chạy rồi nhấn nút không có hiệu lực. Tôi muốn bẫy sự kiện khi nút được nhấn để ứng dụng của tôi có thể kích hoạt tắt hệ thống. Ứng dụng menu của tôi được viết bằng C++ và đang sử dụng SDL. Bất kỳ ý tưởng về cách tôi có thể bẫy sự kiện bấm nút tắt nguồn?Làm cách nào để phát hiện khi người dùng đã nhấn nút tắt nguồn?

Nhờ những người trả lời, đây là mã thực tế tôi đã sử dụng để làm cho nó làm việc:

thành viên Lớp: Mã

int m_acpidsock; 
sockaddr_un m_acpidsockaddr; 

Setup:

/* 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; 
    } 
} 

Mã cập nhật:

/* 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"); 
     } 
    } 
} 

Đóng đang socket:

if(m_acpidsock>=0) 
{ 
    close(m_acpidsock); 
    m_acpidsock=-1; 
} 

Cuối cùng, tôi cần thiết để cho phép người dùng không phải root để tắt máy và làm việc sử dụng dòng này:

sudo chmod u+s /sbin/shutdown 
+2

Không, nhưng điều đó nghe khá hay! –

+0

Số 108 trong cuộc gọi connect() là gì? Nó không phải là sizeof (m_acpidsockaddr) thay vào đó? –

Trả lời

5

Bạn chỉ có thể bắt đầu một chuỗi để đọc từ /proc/events/acpi và giải mã các thư ở đó.

Nhưng cách sử dụng acpid để làm điều đó? Bạn sẽ nghe theo số /var/run/acpid.socket và khi thông báo bạn quan tâm đến, hãy làm những gì bạn đã làm.

Xem: http://www.linuxmanpages.com/man8/acpid.8.php

Tôi hy vọng điều này là hữu ích.

2

Hãy xem acpid, tôi nghĩ bạn có thể thay đổi một trong các tập lệnh trong /etc/acpi/ cụ thể /etc/acpi/powerbtn.sh để thêm lệnh tùy chỉnh. Bạn cũng có thể thử tự mình đọc /proc/acpi/event.

2

Những điều như nhấn nút nguồn kích hoạt sự kiện ACPI sẽ kích hoạt đám cháy khỏi tập lệnh để phản hồi như được định cấu hình trong/etc/acpi/events. Trong trường hợp này bạn muốn/etc/acpi/powerbtn, mà trông giống như sau:

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

Bạn có thể tùy chỉnh /etc/acpi/powerbtn.sh, hoặc điểm nó ở một kịch bản mà bạn chọn.

Các vấn đề liên quan