26 시스템 정보

이 장은 사용하고 있는 특정한 기계_즉 하드웨어의 타입, 소프트웨어의 타입, 그리고 개별적인 기계들의 이름_에 대한 정보를 반환하는 함수를 설명한다.


26. 1 호스트 확인

이 절은 당신의 프로그램이 실행되고 있는 특정한 기계(machine)를 어떻게 확인할 것인지를 설명하고 있다. 기계의 구분은 인터넷 호스트 이름(Internet host name) 과 인터넷 주소(Internet address)로 한다; 그 함수들에 대한 프로토타입은 `unistd. h'에 나와있다. 쉘 명령어 hostname과 hostid는 그들을 호출하여 작업을 수행한다.

함수 : int gethostname (char *name, size_t size)

이 함수는 배열 name에 호스트 기계의 이름을 반환한다. size인수는 이 배열의 크기를 바이트 단위로 지정한다.
이 함수는 성공하면 0을 반환하고, 실패하면 -1을 반환한다. GNU C 라이브러리에서, gethostname은 만일 size 인수가 충분히 크지 않다면 실패하기 때문에 그 경우에는 그 배열을 크게해서 다시 그 함수를 호출하라.
다음의 errno는 이 함수를 위해 정의된 에러상황이다.

ENAMETOOLONG

size 인수가 호스트 이름에다 1을 더한 크기보다 작다. 어떤 시스템에서는, 최대 가능한 호스트 이름의 길이가 심볼 MAXHOSTNAMELEN 어로 정해져있다. 그것은 `sys/param. h'에 정의되어 있다. 그것에 맞지 않는다면 실패로 처리하고 다시 시도하라.

gethostname은 만일 호스트 이름의 길이가 길어서 짤린다고 하더라도 호스트이름을 name에 저장하고 그것을 가리키는 포인터를 반환한다. 어떤 때는 잘려진 호스트이름으로도 충분할 때가 있다. 만일 그렇다면, 그때 발생한 에러코드는 무시할 수 있다.

함수 : int sethostname (const char *name, size_t length)

sethostname 함수는 length의 길이를 가진 문자열 name으로 호스트 기계의 이름을 설정한다. 오직 특권을 가진 프로세스만이 이 일을 하도록 허락된다. 보통 시스템이 부팅할때 딱 한 번 발생한다. 성공하면 반환값은 0이고 실패하면 -1이다.
다음의 errno는 이 함수를 위해 정의된 에러상황이다.
EPERM : 이 프로세스는 특권이 없기 때문에 호스트이름을 설정할 수 없다.

함수 : long int gethostid (void)

이 함수는 프로그램이 실행되고 있는 기계의 "호스트 ID"를 반환한다. 관례적으로, 반환되는 호스트 ID는 보통 기계의 주요한(primary) 인터넷 주소로써, long int로 변환된 것이다. 그러나 어떤 기계에서는 각각의 기계에 불변인(hard-coded) 단일한 번호로 의미가 없다.

함수 : int sethostid (long int id)

sethostid 함수는 id로 호스트 기계의 "호스트 ID"를 설정한다. 오직 특권을 가진 프로세스만이 이러한 일을 하도록 허용된다. 보통 그것은 시스템이 부팅될 때, 딱 한 번 발생한다.
성공하면 반환값은 0이고 실패하면 -1이다. 다음의 errno는 이 함수를 위해 정의된 에러상황이다.

EPERM

이 프로세스는 특권이 없기 때문에 호스트 이름을 설정할 수 없다.

ENOSYS

운영체제가 호스트 ID를 설정하는 것을 지원하지 않는다. 어떤 시스템에서, 호스트 ID는 불변의 단일한 숫자이기 때문에 의미가 없다.


26. 2 하드웨어/소프트웨어 타입 확인하기

당신은 당신의 프로그램이 실행되고 있는 컴퓨터의 타입에 대한 정보를 얻기 위하여 uname 함수를 사용할 수 있다. 이 함수와 그것과 연관된 데이터타입은 헤더파일 `sys/utsname. h'에 선언되어 있다.

데이터타입 : struct utsname

utsname 구조체는 uname 함수에의해 반환된 정보를 저장하는데 사용된다. 다음과 같은 멤버들을 갖는다.

char sysname[] : 사용중인 운영체제의 이름이다.

char nodename[]

이것은 특정한 컴퓨터의 네트웍 이름이다. GNU라이브러리에서, 이 값은 gethostname에 의해 반환된 것과 같은 값이다; 26. 1절 [Host Identification] 참조.

char release[] : 이것은 운영체제의 현재 개정판 번호이다.

char version[] : 이것은 운영체제의 현재 버전(version) 이다.

char machine[]

이것은 사용중인 하드웨어 타입에 대한 명세이다. 어떤 시스템은 이 정보를 직접적으로 커널로부터 얻을 수 있는 메커니즘을 제공한다. 이러한 메커니즘이 없는 시스템에서, GNU C 라이브러리는 그 라이브러리가 만들어지고 인스톨 될 때 정해진 형태에 기초하여 이 필드를 채운다. GNU 는 시스템 구성을 설명하기 위해서 세-부분을 사용한다; 세부분은 중앙처리장치, 제조회사, 그리고 시스템-타입이고, 그들은 대쉬로 구분된다. 어떤 경우에 그 세부분의 조합된 정보는 유용하지만, 대부분은 실제적으로 유용하지 않고 필요가 없다.
기계에서 그 값이 단지 하드웨어에 대한 명세만을 지원한다면, 그것은 두 개의 부분으로 형태의 이름이 구성된다.
예를 들면 다음과 같다:
"sparc-sun", "i386-anything ", "m68k-hp", "m68k-sony", "m68k-sun", "mips-dec"

함수 : int uname (struct utsname *info)

uname 함수는 info가 가리키고 있는 구조체를 운영체제와 호스트 기계에 대한 정보로 채운다. 음이 아닌 값은 성공적으로 정보가 저장되었음을 얘기하고 -1은 실패할 경우 반환된다. 오직 가능한 에러는 EFAULT 밖에 없는데, 그 에러는 항상 발생가능성이 있는 것으로써 간단히 얘기할 수는 없다.