내 학교 Mac OS의 호스트 이름을 가져 오려고합니다. gethostname()
을 사용하지 않고 호스트 이름을 가져 오는 또 다른 방법이 있습니까? 아니요. gethostname()
을 사용하지 않고 호스트 이름을 가져 오는 다른 방법이 있습니까? 나는 man 2 section
에 libc
함수 만 사용할 수 있습니다.C에서 Mac OS의 호스트 이름을 얻는 방법
답변
gethostname
은 sysctl
이고, sysctl
은 단지 syscall
입니다.
syscalls은 매뉴얼의 섹션 2에 (정의에 따라) 있습니다. (당신은 아무도가없는 경우 또는 otool -tV
)
그래서 사람들은 _gethostname
및 _sysctl
을 수출하고 일하러 가야하는 알 (: P 또는 소스를 조회)하는 /usr/lib/system
에, nm
라이브러리를 좋아하는 디스어셈블러를 잡아. 나는 아래
는 syscall
를 사용하여 sysctl
를 사용 gethostname
및 sysctl
을 다시 구현 :
#include <sys/syscall.h> // SYS_sysctl
#include <sys/sysctl.h> // CTL_KERN, KERN_HOSTNAME
#include <unistd.h> // syscall
int sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen)
{
return syscall(SYS_sysctl, name, namelen, oldp, oldlenp, newp, newlen);
}
int gethostname(char *buf, size_t buflen)
{
int name[] = { CTL_KERN, KERN_HOSTNAME };
size_t namelen = 2;
return sysctl(name, namelen, buf, &buflen, NULL, 0);
}
int puts(const char *s)
{
// left as an exercise to the reader ;)
}
int main(void)
{
#define BUFSIZE 256
char buf[BUFSIZE];
size_t buflen = BUFSIZE;
if(gethostname(buf, buflen) == 0)
{
puts(buf);
}
return 0;
}
sysctl
의 구현은 너무 복잡하지 않다; 당신은 다른 인수 앞에 SYS_sysctl
(에서)을 치고 syscall
에 모두 넘겨 줘야합니다.
gethostname
의 구현을 이해하려면, 당신이 알고 얼마나
sysctl
작품 : 조회 된 값이 저장 될 위치를
oldp
입니다.newp
은 새 값을 읽을 곳입니다. 새로운 값을 설정하지 않으므로 여기에NULL
입니다.name
은 실제로는sysctl
에 대한 인수 목록이며 그 내용은 실제로sysctl
이 쿼리되는지 여부에 달려 있습니다.CTL_KERN
은 커널에서 원하는 것을 나타냅니다.
KERN_HOSTNAME
은 호스트 이름을 검색하고자 함을 나타냅니다.
KERN_HOSTNAME
이 (가) 인수를 취하지 않기 때문에 그게 전부입니다.데모 용으로
KERN_PROCARGS
이라고 부른 경우name
에는 추가 인수, 즉 인수가 검색되어야하는 프로세스 ID가 필요합니다. 이 경우
,name
는 다음과 같이 보일 것이다 :int name[] = { CTL_KERN, KERN_PROCARGS, pid };
및
namelen
이에 따라3
로 설정해야합니다.
지금 위의 구현에 당신이 분명히 할 수 없습니다있어 puts
의 사용을했습니다,하지만 난 당신이 strlen
를 다시 구현하는 방법을 알아낼 그와 함께 write
콜을 사용할 수 있습니다 신뢰 . ;)
우리는 "할 일이 없다"사이트입니다. 힌트를주는 것은 충분해야합니다. 모든 코드를 게시하면 OP가 자신의 연구 또는 코딩 기술을 향상시키는 데 도움이되지 않습니다. – Olaf
- 1. OS의 언어 이름을 얻는 방법
- 2. 터미널을 통해 Mac OS의 언어를 얻는 방법
- 3. PircBot 호스트 이름을 얻는 방법
- 4. emberjs에서 호스트 이름을 얻는 방법
- 5. 다른 OS의 로컬 호스트 연결
- 6. 호스트 이름을 사용하여 네트워크상의 Mac 컴퓨터에 액세스
- 7. C에서 외부 IP의 MAC 주소를 얻는 방법
- 8. 리눅스 우분투 원격 호스트 이름을 얻는 방법
- 9. Heroku에서 현재 호스트 이름을 얻는 방법
- 10. Silverlight - IP에서 호스트 이름을 얻는 방법?
- 11. UDP를 사용하여 호스트 이름을 얻는 방법 C#
- 12. 안드로이드에서 IP 주소의 호스트 이름을 얻는 방법?
- 13. Expect를 통해 원격 호스트 이름을 얻는 방법?
- 14. 현재 호스트 이름을 터미널의 제목으로 얻는 방법
- 15. C에서 폴더의 파일 이름을 얻는 방법 #
- 16. Linq C에서 # : ID를 통해 이름을 얻는 방법
- 17. C에서 Windows 로그인 이름을 얻는 방법 #
- 18. Mac-OS의 목록에서 파일을 선택하는 방법
- 19. Adobe AIR의 Linux에서 호스트 이름을 얻는 방법 NativeProcess
- 20. MAC OS의 NSTableCellView 사용자 정의
- 21. 호스트 파일에서 호스트 이름을 참조하는 방법은 무엇입니까?
- 22. 알려진 호스트 이름 목록에서 IP 및 MAC 정보를 얻는 방법
- 23. 호스트 이름을
- 24. 자바에서 OS의 CPU 사용률을 얻는 방법
- 25. 소켓의 안정적인 호스트 이름을 얻는 방법은 무엇입니까?
- 26. freemarker 템플릿에서 호스트 이름을 얻는 방법은 무엇입니까?
- 27. 큰 목록에서 호스트 이름을 수집하는 호스트 이름을 묻는 방법
- 28. Java에서 OS의 기본 미디어 플레이어 이름을 얻는 방법은 무엇입니까?
- 29. Java가이 예외에서받는 것과 동일한 호스트 이름을 얻는 방법
- 30. 파이썬에서 원래의 TCP 연결 호스트 이름을 얻는 방법?
첫 번째 : http://linux.die.net/man/2/gethostname, 두 번째 : 맨 페이지의 어떤 부분이 중요합니까? – KevinDTimm
매뉴얼 페이지의'gethostname()'에 문제가있는 이유는 무엇입니까? (BSD에서 파생 된 시스템에서 섹션 2는 시스템 호출만을 문서화하고 라이브러리 함수는 섹션 3에 있습니다). – dhke
해결 방법 :'f = popen ("hostname")'f를 읽으십시오. –