2009-03-24 27 views
10

Tôi đang sử dụng SDL cho một ứng dụng OpenGL, chạy trên Linux. Vấn đề của tôi là SDL đang bắt SIGINT và bỏ qua nó. Đây là một nỗi đau vì tôi đang phát triển thông qua một phiên màn hình, và tôi không thể giết chương trình đang chạy với CTRL-C (chương trình máy tính đang chạy được kết nối với máy chiếu và không có thiết bị đầu vào).Chương trình SDL/C++ OpenGL, làm thế nào để tôi ngừng SDL bắt được SIGINT

Có cờ hay thứ gì đó tôi có thể chuyển sang SDL để nó không chụp SIGINT không? Tôi thực sự chỉ muốn chương trình dừng lại khi nó nhận được tín hiệu (tức là khi tôi nhấn ctrl-c).

Trả lời

11

Ctrl-C tại bảng điều khiển tạo sự kiện SDL_QUIT. Bạn có thể theo dõi sự kiện này bằng cách sử dụng SDL_PollEvent hoặc SDL_WaitEvent và thoát (sạch) khi phát hiện sự kiện.

Lưu ý rằng các hành động khác có thể tạo sự kiện SDL_QUIT (ví dụ: cố gắng đóng cửa sổ chính của bạn thông qua trình quản lý cửa sổ).

3

Vượt qua SDL_INIT_NOPARACHUTE cờ khởi tạo tới SDL_Init "Ngăn chặn SDL bắt các tín hiệu gây tử vong".


Xem: http://www.libsdl.org/cgi/docwiki.cgi/SDL_Init

+0

Cờ NOPARACHUTE dường như không bắt SIGINT, chỉ những vấn đề nghiêm trọng như lỗi segmentation vv – MichaelM

5

Tôi đã tìm thấy một câu trả lời:

Cờ SDL_INIT_NOPARACHUTE sẽ chụp tín hiệu gây tử vong do đó SDL có thể dọn dẹp sau khi chính nó. Nó hoạt động cho những thứ như SIGSEGV, nhưng dường như SIGINT không đủ tử vong.

Giải pháp của tôi là để thiết lập lại xử lý tín hiệu để SIGINT sau SDL đã được khởi tạo:

SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE); 
signal(SIGINT, SIG_DFL); 

Cảm ơn Cache cho bạn nhập vào, nó đưa tôi đi đúng hướng.

Michael

+1

Cách chính xác để giải quyết vấn đề này là bằng cách nghe các sự kiện SDL_QUIT như Steve S đã đề cập. – Grumbel

1

Nếu bạn không thực sự sử dụng vòng lặp sự kiện vì một lý do nào đó, bạn có thể sử dụng SDL_QuitRequested trong vòng lặp "nội dung cuộc thăm dò ý kiến" của mình.

1

Trong SDL_quit.c, có kiểm tra các gợi ý để xác định liệu trình xử lý tín hiệu có nên không được sử dụng trong SDL_QuitInit() hay không. Bạn không chắc chắn nếu điều này tồn tại trong các phiên bản cũ hơn khi câu hỏi ban đầu được hỏi, nhưng có thể hữu ích cho những người đến đây tươi.

Chỉ cần thử nghiệm trên ứng dụng Windows của tôi, tôi bây giờ có thể nhận được tất cả các tín hiệu đúng một lần nữa, sử dụng:

SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1"); 
SDL_Init(...); 
Các vấn đề liên quan