2015-01-13 20 views

Antwort

6

In Windows- Umgebung können Sie getenv("COMPUTERNAME") verwenden getenv("USERNAME")
In Linux-getenv("HOSTNAME"), getenv("USER")

Siehe getenv reference

14

Windows-

Sie können versuchen, GetComputerName undzu verwenden, hier ist ein Beispiel:

#define INFO_BUFFER_SIZE 32767 
TCHAR infoBuf[INFO_BUFFER_SIZE]; 
DWORD bufCharCount = INFO_BUFFER_SIZE; 

// Get and display the name of the computer. 
if(!GetComputerName(infoBuf, &bufCharCount)) 
    printError(TEXT("GetComputerName")); 
_tprintf(TEXT("\nComputer name:  %s"), infoBuf); 

// Get and display the user name. 
if(!GetUserName(infoBuf, &bufCharCount)) 
    printError(TEXT("GetUserName")); 
_tprintf(TEXT("\nUser name:   %s"), infoBuf); 

siehe: GetComputerName und GetUserName

Linux

Verwenden gethostname Computernamen (siehe gethostname) zu bekommen, und getlogin_r erhalten Benutzername anmelden. Weitere Informationen finden Sie unter man page of getlogin_r. Einfache Bedienung wie folgt:

#include <unistd.h> 
#include <limits.h> 

char hostname[HOST_NAME_MAX]; 
char username[LOGIN_NAME_MAX]; 
gethostname(hostname, HOST_NAME_MAX); 
getlogin_r(username, LOGIN_NAME_MAX); 
+1

Über [HOST_NAME_MAX] (http://stackoverflow.com/questions/30084116/host-name-max-undefined-after-include-limits-h). – Antonio

7

Auf POSIX-Systemen können Sie die gethostname und getlogin Funktionen nutzen, die beide in unistd.h erklärt.

/* 
    This is a C program (I've seen the C++ tag too late). Converting 
    it to a pretty C++ program is left as an exercise to the reader. 
*/ 

#include <limits.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int 
main() 
{ 
    char hostname[HOST_NAME_MAX]; 
    char username[LOGIN_NAME_MAX]; 
    int result; 
    result = gethostname(hostname, HOST_NAME_MAX); 
    if (result) 
    { 
     perror("gethostname"); 
     return EXIT_FAILURE; 
    } 
    result = getlogin_r(username, LOGIN_NAME_MAX); 
    if (result) 
    { 
     perror("getlogin_r"); 
     return EXIT_FAILURE; 
    } 
    result = printf("Hello %s, you are logged in to %s.\n", 
        username, hostname); 
    if (result < 0) 
    { 
     perror("printf"); 
     return EXIT_FAILURE; 
    } 
    return EXIT_SUCCESS; 
} 

Mögliche Ausgabe:

Hello 5gon12eder, you are logged in to example.com. 

Dies scheint sicherer als auf Umgebungsvariablen angewiesen, die nicht immer vorhanden.

Ich abziehende die letzte Aussage, weil

  • die Manpage von getlogin tatsächlich seine Verwendung für getenv("LOGIN") und
  • schreckt
  • der getlogin_r Anruf in dem obigen Programm nicht mit ENOTTY, wenn ich das laufen Programm von innerhalb Emacs anstelle eines interaktiven Terminals, während getenv("USER") in beiden Situationen gearbeitet hätte.
2

Verwenden gethostname() Computernamen zu bekommen, sowohl windows und linux unterstützen.

3

In Bezug auf Denis Antwort, beachten Sie, dass getenv("HOSTNAME") für Linux may not always work because the environment variables may not be exported to the program.

Multi-Plattform C++ Codebeispiel nur die Computernamen zu holen (das ist, was für meinen Win7 und CentOS Maschinen gearbeitet):

char *temp = 0; 
    std::string computerName; 

#if defined(WIN32) || defined(_WIN32) || defined(_WIN64) 
    temp = getenv("COMPUTERNAME"); 
    if (temp != 0) { 
     computerName = temp; 
     temp = 0; 
    } 
#else 
    temp = getenv("HOSTNAME"); 
    if (temp != 0) { 
     computerName = temp; 
     temp = 0; 
    } else { 
     temp = new char[512]; 
     if (gethostbyname(temp, 512) == 0) { // success = 0, failure = -1 
      computerName = temp; 
     } 
     delete []temp; 
     temp = 0; 
    } 
#endif 
1

Wenn Sie Boost-verwenden können, können Sie dies einfach das tun bekommen können Hostname:

#include <boost/asio/ip/host_name.hpp> 
// ... whatever ... 
auto host_name = boost::asio::ip::host_name(); 
+0

Dies ist die einzige wirklich plattformübergreifende Antwort auf diese Frage, danke! – oLen

Verwandte Themen