Определить ОС во время выполнения - PullRequest
7 голосов
/ 03 января 2012

Ни ISO C, ни POSIX не предоставляют функциональные возможности для определения базовой ОС во время выполнения.С теоретической точки зрения это не имеет значения, так как C предлагает оболочки для самых распространенных системных вызовов, а с точки зрения «придирки» даже не нужно быть базовой ОС.

Однако во многих реальных сценариях оказалось полезным знать больше о хост-среде, чем С готов поделиться, например, чтобы выяснить, где хранить файлы конфигурации или как вызывать select(), поэтому:

Существует ли идиоматический способ для приложения, написанного на C, определить базовую ОС во время выполнения?

По крайней мере, я могу легко выбирать между Linux, Windows, BSD иMacOS?

В настоящее время я предполагаю проверить наличие определенных файлов / каталогов, таких как C:\ или /, но этот подход кажется ненадежным.Возможно, запрос ряда таких источников может помочь установить понятие «отпечатки ОС», что повысит надежность.В любом случае, я с нетерпением жду ваших предложений.

Ответы [ 5 ]

6 голосов
/ 03 января 2012

На самом деле, большинство систем имеют команду uname, которая показывает текущее используемое ядро. В Mac OS это обычно «Darwin», в Linux это просто «Linux», в Windows «ERROR» и FreeBSD возвращает «FreeBSD».

Более полный список uname выходов

Я почти уверен, что есть эквивалент C для uname, поэтому вам не понадобится system()

3 голосов
/ 03 января 2012

ЕСЛИ вы находитесь в системе POSIX, вы можете вызвать uname () из <sys/utsname.h>.

Это, очевидно, не на 100% переносимо, но я не думаю, что тамбудет любой метод, который может предоставить это во время выполнения.

см. справочную страницу для деталей

1 голос
/ 03 января 2012

Время выполнения - не время для определения этого, поскольку двоичные файлы без эпических ключей не могут работать на другой, вам нужно просто использовать #ifdef вокруг кода, чувствительного к платформе.

0 голосов
/ 20 ноября 2018

Принятый ответ гласит uname, но не дает минимального рабочего примера, поэтому здесь он для всех, кто заинтересован - надеюсь, он сэкономит вам время, которое у меня ушло:

#include <stdio.h>
#include <stdlib.h>
#include <sys/utsname.h>

int main(void) {
   struct utsname buffer;
   if (uname(&buffer) != 0) {
      perror("uname");
      exit(0);
   }
   printf("OS: %s\n", buffer.sysname);

   return 0;
}

(возможно) Вывод:

ОС: Linux

PS: К сожалению, здесь используется заголовок POSIX: Сбой компиляции из-за отсутствия файла sys / utsname.h , который, скорее всего, не будет работать в Windows.

0 голосов
/ 19 апреля 2017
if (strchr(getenv("PATH"),'\\'))
    puts("You may be on windows...");

Даже я согласен с тем, что "Время выполнения не время, чтобы определить это ..."

...