2012-01-03 36 views
5

Cả ISO C lẫn POSIX đều không cung cấp chức năng để xác định hệ điều hành bên dưới trong thời gian chạy. Từ quan điểm lý thuyết, nó không quan trọng vì C cung cấp hàm bao cho các cuộc gọi hệ thống phổ biến nhất, và từ quan điểm chọn nit, thậm chí không có một hệ điều hành cơ bản.Xác định hệ điều hành trong thời gian chạy

Tuy nhiên, trong nhiều trường hợp trong thế giới thực, nó đã chứng tỏ hữu ích khi biết thêm về môi trường máy chủ lưu trữ hơn C sẵn sàng chia sẻ, ví dụ: để tìm nơi lưu trữ tệp cấu hình hoặc cách gọi số select(), vì vậy:

Có cách nào thành ngữ cho ứng dụng được viết bằng C để xác định hệ điều hành cơ bản trong thời gian chạy không?

Ít nhất, tôi có thể dễ dàng quyết định giữa Linux, Windows, BSD và MacOS không?

Dự đoán hiện tại của tôi là kiểm tra sự tồn tại của các tệp/thư mục nhất định, chẳng hạn như C:\ hoặc /, nhưng cách tiếp cận này có vẻ không đáng tin cậy. Có thể truy vấn một loạt các nguồn như vậy có thể giúp thiết lập khái niệm "dấu vân tay OS", do đó tăng độ tin cậy. Dù sao, tôi mong được đề xuất của bạn.

+11

Er, bạn biết thông tin này tại thời gian biên dịch –

+0

Làm thế nào để xác định hệ điều hành tại * runtime * giúp bạn viết một 'select()' gọi chính xác? –

+0

+1, @David. Ít nhất là đối với những khác biệt như Linux so với Windows so với Mac OS X, vv Tôi đoán một cách chạy thời gian để phân biệt giữa các phiên bản khác nhau của mỗi phiên bản có thể là những gì OP đang tìm kiếm, nhưng câu trả lời cho điều đó sẽ cụ thể cho từng hệ điều hành, có lẽ là. –

Trả lời

5

Thực ra, hầu hết các hệ thống đều có lệnh uname hiển thị hạt nhân hiện tại đang sử dụng. Trên Mac OS, điều này thường là "Darwin", trên Linux nó chỉ đơn giản là "Linux", trên Windows nó "ERROR" và FreeBSD sẽ trả về "FreeBSD".

More complete list of uname outputs

Tôi khá chắc chắn rằng có một C tương đương cho uname, vì vậy bạn sẽ không cần system()

+0

bạn đánh tôi với nó. – rsaxvc

+0

Có vẻ như tôi đã đánh bại tất cả các bạn :-) –

+0

@Tom Bạn có chắc chắn về những gì xảy ra trên Windows không? Đối với tất cả các trình biên dịch C? –

2

NẾU bạn đang ở trên một hệ thống POSIX, bạn có thể gọi uname() từ <sys/utsname.h>.

Điều này rõ ràng không phải là 100% di động, nhưng tôi không nghĩ rằng sẽ có bất kỳ phương pháp nào có thể cấp điều đó khi chạy.

thấy the man page để biết chi tiết

1

Runtime không phải là thời gian để xác định điều này, là rằng nếu không có kludges nhị phân sử thi cho một nền tảng sẽ không chạy trên khác, bạn nên chỉ cần sử dụng #ifdef s xung quanh mã nhạy cảm nền tảng.

+2

-1 vì câu hỏi là về cách xác định hệ điều hành trong thời gian chạy, không phải bạn có nên thực hiện hay không. – Ataraxia

+0

Vâng, nhưng điều đó không giúp OP. Đối với phần lớn các trường hợp _VAST_ một đối tượng được phát ra cho FreeBSD sẽ không hoạt động trên Linux anyway (mà giữ cho hầu hết các trường hợp của mình) để làm điều này trong thời gian chạy là ít nhất của tai ương của mình. – richo

-2
if (strchr(getenv("PATH"),'\\')) 
    puts("You may be on windows..."); 

Ngay cả làm tôi đồng ý rằng "Thời gian chạy không phải là thời gian để xác định điều này ..."

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