2012-01-03 25 views
5

Ni ISO C ni POSIX ofrecen la funcionalidad para determinar el sistema operativo subyacente durante el tiempo de ejecución. Desde el punto de vista teórico, no importa ya que C ofrece envoltorios para las llamadas al sistema más comunes, y desde el punto de vista de la eliminación de detalles, ni siquiera tiene que ser un sistema operativo subyacente.Determine el sistema operativo durante el tiempo de ejecución

Sin embargo, en muchos escenarios del mundo real, ha resultado útil saber más acerca del entorno de host que C está dispuesto a compartir, p. para averiguar dónde almacenar los archivos de configuración o cómo llamar a select(), entonces:

¿Existe una forma idiomática para que una aplicación escrita en C determine el sistema operativo subyacente durante el tiempo de ejecución?

Al menos, ¿puedo decidir fácilmente entre Linux, Windows, BSD y MacOS?

Mi conjetura actual es verificar la existencia de ciertos archivos/directorios, como C:\ o /, pero este enfoque parece poco confiable. Quizás consultar una serie de tales fuentes puede ayudar a establecer la noción de "huellas dactilares del sistema operativo", aumentando así la fiabilidad. De todos modos, espero sus sugerencias.

+11

Er, que conoce esta información en tiempo de compilación –

+0

¿Cómo determinar el sistema operativo en tiempo de ejecución * * ayuda que escribe una llamada 'select()' correctamente? –

+0

+1, @David. Al menos para diferencias como Linux vs. Windows vs. Mac OS X, etc. Supongo que una forma de tiempo de ejecución para diferenciar entre las diferentes versiones de cada uno de ellos podría ser lo que el OP está buscando, pero la respuesta a eso sería específica para cada uno sistema operativo, presumiblemente. –

Respuesta

5

En realidad, la mayoría de los sistemas tienen un comando uname que muestra el kernel actual en uso. En Mac OS, esto suele ser "Darwin", en Linux es simplemente "Linux", en Windows es "ERROR" y FreeBSD devolverá "FreeBSD".

More complete list of uname outputs

Estoy bastante seguro de que hay un equivalente de C uname, por lo que no tendrá que system()

+0

me ganaste. – rsaxvc

+0

Parece que les gané a todos ustedes :-) –

+0

@Tom ¿Estás seguro de lo que sucede en Windows? Para todos los compiladores de C? –

2

SI que está en un sistema POSIX, puede llamar uname() desde <sys/utsname.h>.

Esto, obviamente, no es 100% portátil, pero no creo que haya ningún método que pueda otorgar eso en tiempo de ejecución.

ver the man page para más detalles

1

tiempo de ejecución no es el momento para determinar esto, es que sin kludges binarios épicas para una plataforma no se ejecutará en otra, sólo debe utilizar #ifdef s alrededor del código sensibles plataforma.

+2

-1 porque la pregunta era sobre cómo determinar el sistema operativo en tiempo de ejecución, no si debería o no hacerlo. – Ataraxia

+0

Sí, pero eso no ayuda al OP. Para la mayoría de los casos _VAST_, un objeto emitido para FreeBSD no funcionará en Linux de todos modos (lo cual es válido para la mayoría de sus casos) por lo que hacer esto en tiempo de ejecución es el menor de sus problemas. – richo

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

incluso no estoy de acuerdo que "en tiempo de ejecución no es el momento de determinar esto ..."

Cuestiones relacionadas