2012-05-23 44 views
6

Tôi đang viết mã sử dụng sched_setaffinity, yêu cầu kernel 2.5.8 trở lên. Tôi đã cố gắng tìm hiểu xem những điều này có thể thực hiện được không:Làm thế nào để sử dụng một cách an toàn các chức năng Linux mới?

  1. Hệ thống có hạt nhân cũ để biên dịch một cách duyên dáng, có lẽ chỉ bỏ qua đoạn mã đó hoàn toàn.
  2. Nếu tôi gửi một người có hạt nhân lớn hơn một tệp nhị phân đã biên dịch, nó sẽ bước qua chức năng này hoặc chỉ cần in cảnh báo.

Tôi đoán câu hỏi của tôi là, làm thế nào để bạn sử dụng các hàm hạt nhân mới một cách an toàn, mà không vi phạm toàn bộ ứng dụng khi sử dụng hệ thống cũ hơn?

+4

Đừng lo lắng về chuỗi hạt nhân 2,5 và bất cứ điều gì trước đây. Bất kỳ ai vẫn đang sử dụng chúng nên được đưa vào tổ chức tâm thần hoặc một cái gì đó :) –

+1

@Nikolai: Khá nhiều thiết bị Linux nhúng vẫn chạy 2.4.x. –

+1

Tôi chắc chắn rằng họ làm. Họ cũng xây dựng một cách cẩn thận tập hợp các tập tin nhị phân của userland rất hạn chế, do đó nhóm mục tiêu không phải là vấn đề ở đây. –

Trả lời

2

Bạn đang cố gắng để chương trình của mình liên kết hoặc chạy? Bạn có thể gọi trực tiếp hệ thống thông qua chức năng glibc syscall() mà không cần thư viện C gần đây. Rõ ràng nó sẽ thất bại trên các hệ thống trước đó mà không cần hỗ trợ (một thử nghiệm nhanh cho thấy hạt nhân trả về -1 == ENOSYS cho các số syscall chưa được thực hiện), vì vậy bạn sẽ cần phải kiểm tra cho điều đó.

3

Sử dụng dlopen() với NULL làm tên tệp và dlsym() chức năng bạn muốn sử dụng. Nếu dlsym() thành công, hãy gọi hàm thông qua con trỏ hàm được trả về.

+2

Ngay cả khi biểu tượng nằm trong libc, cuộc gọi vẫn có thể thất bại với 'ENOSYS'. –

+0

Không cần thiết phức tạp. Chỉ cần sử dụng syscall(). –

+0

Cả hai âm thanh này đều giống như các lựa chọn tốt. Từ những gì tôi có thể nói, dlopen/dlsym() kiểm tra xem hàm có tồn tại không. Và syscall() chỉ là một cách khác để gọi các cuộc gọi hệ thống linux, thông qua glibc. Tuy nhiên, tại sao có syscall ở tất cả? Điều này làm gì khác ngoài việc thêm một lớp trừu tượng khác? Giải pháp này có vẻ đầy hứa hẹn, tôi chỉ muốn đảm bảo rằng nó không làm bất cứ điều gì khác có thể không mong muốn. – wlformyd

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