Cách thực hành tốt nhất cho ứng dụng daemon chạy bằng root cần truy cập vào GUI là gì? [đóng cửa]


1

Tôi đang chuyển qua ứng dụng C ++ / Qt từ Windows. Trên Windows, chương trình chạy như một dịch vụ. Nó không được khuyến khích từ các chương trình chạy như một dịch vụ để tương tác với người dùng và hiển thị các thành phần GUI.

Do đó, chương trình của tôi có hai phần. Phần đầu tiên chạy như một daemon dịch vụ và phát âm thanh trong nền. Chương trình khởi động khi máy tính khởi động. Chương trình thứ hai, khởi động khi bất kỳ người dùng nào đăng nhập (Qua Menu bắt đầu- & gt; Tất cả người dùng- & gt; Khởi động), giao tiếp qua ổ cắm cục bộ với trình nền dịch vụ để hiển thị GUI bật lên khi âm thanh phát.

Chuyển sang MacOS, cách tốt nhất để sử dụng cùng một chương trình là gì?

Tôi có nên hợp nhất cả hai chương trình thành một và chạy nó dưới quyền root thông qua launchd và có GUI hiển thị một daemon cũng như phát âm thanh không?

Hoặc tôi nên giữ nó như hai chương trình như bây giờ - root daemon phát âm thanh và tìm cách mà chương trình thứ hai có thể tự động thực thi khi mỗi người dùng đăng nhập?

Câu trả lời:


2

Trên macOS, bạn nên tránh chạy bất kỳ quy trình nào như root. Apple có thể sẽ đề nghị giữ loại ứng dụng này thành hai phần. Mỗi phần nên được sandbox với quyền lợi thích hợp.

Quá trình rộng máy tính nền của bạn sẽ không thể truy cập vào giao diện đồ họa. Bạn sẽ nhu cầu một quy trình thứ hai chạy trong phiên của người dùng để cung cấp giao diện cho người dùng.

Sử dụng launchd để khởi động quy trình rộng máy tính của bạn theo yêu cầu; xem các dịch vụ XPC dưới đây. Bằng cách này, trong khi không có gì đang chơi, bạn tránh tiêu thụ bất kỳ tài nguyên nào.

Dịch vụ XPC

Đối với macOS, Apple muốn bạn giao tiếp bằng cách sử dụng Dịch vụ XPC kiến trúc. Cách tiếp cận này sử dụng các cổng Mach ở mức thấp, nhưng các quy trình của bạn không cần quá quan tâm đến chi tiết đó.


Đuợc. Vậy trên Mac có khả năng tự động khiến chương trình GUI được khởi động khi có bất kỳ người dùng nào đăng nhập vào hệ thống không?
Mikey A. Leonetti

1
Vâng, một công việc khởi động trong /Library/LaunchAgents/ sẽ cung cấp điều này. Xem man launchd.plist để biết thêm chi tiết. Chúc may mắn; Đây sẽ là thử thách! ;-)
Graham Miln
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.