2016-09-08 6 views
0

В программе C мне нужно найти OSTYPE во время выполнения, на основе которого я сделаю некоторые операции.Определите `OSTYPE` во время выполнения в программе C

Вот код

#include <stdlib.h> 
#include <string.h> 

int main() { 
    const char * ostype = getenv("OSTYPE"); 
    if (strcasecmp(ostype, /* insert os name */) == 0) ... 
    return 0; 
} 

Но getenv возвращается NULL (и есть ошибка сегментации). Когда я делаю echo $OSTYPE в терминале, он печатает darwin15. Но когда я делаю env | grep OSTYPE, ничего не печатается, а это значит, что он не находится в списке переменных окружения. Чтобы он работал на моем локальном компьютере, я могу перейти на .bash_profile и экспортировать OSTYPE вручную, но это не решит проблему, если я хочу запустить сгенерированный исполняемый файл на новом компьютере.

Почему OSTYPE доступен во время работы терминала, но, видимо, нет в списке переменных окружения. Как обойти это?

+0

Да, но это должно быть UNIX, не так ли? https://developer.apple.com/library/ios/documentation/System/Conceptual/ManPages_iPhoneOS/man3/getenv.3.html – AbKDs

+0

Потому что bash устанавливает его. Нет bash, нет переменной. –

+0

@iharob, если я запускаю исполняемый файл где-то в другом месте, тогда мне нужно знать OSTYPE. – AbKDs

ответ

1

Для сбоя вы должны проверить, был ли возврат NULL или нет, прежде чем использовать его в strcmp или любой функции. От человека 3 GetEnv:

Функция GETENV() возвращает указатель на значение в среде, или NULL, если совпадений не найдено.

Если вы находитесь в POSIX (большинство Unix и как-то все Linux), я согласен с комментарием Пола на uname.

Но на самом деле вы можете проверить OSTYPE во время компиляции с предкомпилятору (с # IFDEF в), вот такой же вопрос о так: Determine OS during runtime

Edit: uname

Хороший момент Джонатан. человек 2 uname на моем Linux рассказывает, как использовать (и начать POSIX, MacOS имеет тот же заголовок, тоже):

СИНТАКСИС

#include <sys/utsname.h> 

    int uname(struct utsname *buf); 

ОПИСАНИЕ uname() возвращает системную информацию в структуре, на которую указывает ЬиЕ. Структура utsname - , определенная в:

 struct utsname { 
      char sysname[]; /* Operating system name (e.g., "Linux") */ 
      char nodename[]; /* Name within "some implementation-defined 
           network" */ 
      char release[]; /* Operating system release (e.g., "2.6.28") */ 
      char version[]; /* Operating system version */ 
      char machine[]; /* Hardware identifier */ 
     #ifdef _GNU_SOURCE 
      char domainname[]; /* NIS or YP domain name */ 
     #endif 
     }; 
+0

OP может хотеть рассказать разницу между 'darwin14' и' darwin15' во время выполнения, после того, как код был скомпилирован на платформе, что означает, что он может работать и с. Это непонятно. –

Смежные вопросы