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
Không, nhưng điều đó nghe khá hay! –
Số 108 trong cuộc gọi connect() là gì? Nó không phải là sizeof (m_acpidsockaddr) thay vào đó? –