そして彭世才をもっと近くで見つけたいと思い、菊に酔いしれる。
システムメッセージ
システムID uname
システム コールは、uname()
現在のオペレーティング システム カーネルの名前と情報を取得するために使用されます。関数のプロトタイプは次のとおりです ( man 2 uname
" " コマンドで表示できます)。
#include <sys/utsname.h>
int uname(struct utsname *buf);
この機能を使用するには、ヘッダー ファイルをインクルードする必要があります<sys/utsname.h>
。
関数のパラメータと戻り値は次の意味を持ちます。
buf
:struct utsname
構造体型オブジェクトを指すstruct utsname
構造体型ポインタ。
戻り値: 成功した場合は 0 が返され、失敗した場合は -1 が返され、 が設定されますerrno
。
uname()
関数の使い方は非常に簡単で、struct utsname
構造体変数を定義し、uname()
関数呼び出し時にその変数のアドレスを渡すだけですstruct utsname
。
struct utsname {
char sysname[]; /* 当前操作系统的名称 */
char nodename[]; /* 网络上的名称(主机名) */
char release[]; /* 操作系统内核版本 */
char version[]; /* 操作系统发行版本 */
char machine[]; /* 硬件架构类型 */
#ifdef _GNU_SOURCE
char domainname[];/* 当前域名 */
#endif
};
struct utsname
構造体のメンバー変数はすべて文字配列であるため、取得される情報はすべて文字列であることがわかります。
テスト:
現在のオペレーティング システム名、ホスト名、カーネル バージョン、オペレーティング システム リリース バージョン、プロセッサ ハードウェア アーキテクチャ タイプなどの情報を取得して出力する簡単なプログラムを作成します。テスト コードは次のとおりです。
#include <stdio.h>
#include <stdlib.h>
#include <sys/utsname.h>
int main(void)
{
struct utsname os_info;
int ret;
/* 获取信息 */
ret = uname(&os_info);
if (-1 == ret) {
perror("uname error");
exit(-1);
}
/* 打印信息 */
printf("操作系统名称: %s\n", os_info.sysname);
printf("主机名: %s\n", os_info.nodename);
printf("内核版本: %s\n", os_info.release);
printf("发行版本: %s\n", os_info.version);
printf("硬件架构: %s\n", os_info.machine);
exit(0);
}
操作結果:
sundp@sundongpeng:~/workspace/c_program/April$ gcc uname.c
sundp@sundongpeng:~/workspace/c_program/April$ ./a.out
オペレーティング システム名: Linux
ホスト名: sundongpeng
カーネル バージョン: 4.15.0-29 -汎用
リリース バージョン: #31~16.04.1-Ubuntu SMP Wed Jul 18 08:54:04 UTC 2018
ハードウェア アーキテクチャ: x86_64
sysinfo関数
sysinfo
システム コールは一部のシステム統計を取得するために使用できます。その関数プロトタイプは次のとおりです。
#include <sys/sysinfo.h>
int sysinfo(struct sysinfo *info);
関数のパラメータと戻り値は次の意味を持ちます。
info
:struct sysinfo
構造体型オブジェクトを指すstruct sysinfo
構造体型ポインタ。
戻り値: 成功した場合は 0 が返され、失敗した場合は -1 が返され、 が設定されますerrno
。
関数の使い方も sysinfo()
非常に簡単で、構造体変数を定義しstruct sysinfo
、sysinfo()
関数呼び出し時にその変数のアドレスを渡すだけで、struct sysinfo
次のような構造になります。
struct sysinfo {
long uptime; /* 自系统启动之后所经过的时间(以秒为单位) */
unsigned long loads[3]; /* 1, 5, and 15 minute load averages */
unsigned long totalram; /* 总的可用内存大小 */
unsigned long freeram; /* 还未被使用的内存大小 */
unsigned long sharedram; /* Amount of shared memory */
unsigned long bufferram; /* Memory used by buffers */
unsigned long totalswap; /* Total swap space size */
unsigned long freeswap; /* swap space still available */
unsigned short procs; /* 系统当前进程数量 */
unsigned long totalhigh; /* Total high memory size */
unsigned long freehigh; /* Available high memory size */
unsigned int mem_unit; /* 内存单元大小(以字节为单位) */
char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding to 64 bytes */
};
テスト:
#include <stdio.h>
#include <stdlib.h>
#include <sys/sysinfo.h>
int main(void)
{
struct sysinfo sys_info;
int ret;
/* 获取信息 */
ret = sysinfo(&sys_info);
if (-1 == ret) {
perror("sysinfo error");
exit(-1);
}
/* 打印信息 */
printf("uptime: %ld\n", sys_info.uptime);
printf("totalram: %lu\n", sys_info.totalram);
printf("freeram: %lu\n", sys_info.freeram);
printf("procs: %u\n", sys_info.procs);
exit(0);
}
操作結果:
sundp@sundongpeng:~/workspace/c_program/April$ gcc sysinfo.c
sundp@sundongpeng:~/workspace/c_program/April$ ./a.out
オペレーティング システム名: Linux
ホスト名: sundongpeng
カーネル バージョン: 4.15.0-29 -汎用
リリース バージョン: #31~16.04.1-Ubuntu SMP Wed Jul 18 08:54:04 UTC 2018
ハードウェア アーキテクチャ: x86_64
gethostname関数
この関数は、データ構造内の変数と同様に、Linux
システムのホスト名を個別に取得するために使用できます。関数のプロトタイプは次のとおりです ( 「」コマンドで表示できます)。struct utsname
nodename
gethostname
man 2 gethostname
#include <unistd.h>
int gethostname(char *name, size_t len);
この関数を使用するには、ヘッダー ファイルをインクルードする必要があります<unistd.h>
。
関数のパラメータと戻り値は次の意味を持ちます。
name
: ホスト名文字列を格納するために使用されるバッファを指します。
len
: バッファ長。
戻り値: 成功した場合は を返し0
、失敗した場合は を返し-1
、 が設定されますerrno
。
テスト:関数を
使用してシステムのホスト名を取得します。gethostname
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(void)
{
char hostname[20];
int ret;
memset(hostname, 0x0, sizeof(hostname));
ret = gethostname(hostname, sizeof(hostname));
if (-1 == ret) {
perror("gethostname error");
exit(ret);
}
puts(hostname);
exit(0);
}
操作結果:
sundp@sundongpeng:~/workspace/c_program/April$ gcc gethostname.c
sundp@sundongpeng:~/workspace/c_program/April$ ./a.out
sundongpeng
sysconf() 関数
sysconf()
page size
この関数は、ページ サイズ ( )、ホスト名の最大長、プロセスが開くことができるファイルの最大数、ファイルの最大数など、実行時にID
システムの構成情報を取得できるライブラリ関数です。ユーザーごとの同時プロセスなど。その関数プロトタイプは次のとおりです。
#include <unistd.h>
long sysconf(int name);
この機能を使用するには、ヘッダー ファイルをインクルードする必要があります<unistd.h>
。システムの構成情報を取得する関数
を呼び出します。パラメータは、どの構成情報を取得するかを指定します。パラメータは、次のいずれかの値を取ることができます (すべてマクロ定義であり、マニュアルで照会できます):sysconf()
name
name
⚫ _SC_ARG_MAX: exec ファミリの関数のパラメータの最大長。exec ファミリの関数については後で紹介します。ここでは無視しましょう。
⚫ _SC_CHILD_MAX: ユーザーごとの同時プロセスの最大数、つまり、同じユーザーが同時に実行できるプロセスの最大数。
⚫ _SC_HOST_NAME_MAX: ホスト名の最大長。
⚫ _SC_LOGIN_NAME_MAX: ログイン名の最大長。
⚫ _SC_CLK_TCK: 1 秒あたりのクロック ティック数、つまりシステム ティック レート。
⚫ _SC_OPEN_MAX: プロセスが開くことができるファイルの最大数。
⚫ _SC_PAGESIZE: システムページサイズ (ページサイズ)。
⚫ _SC_TTY_NAME_MAX: 端末デバイス名の最大長。
⚫……
上記以外にもたくさんありますので、ここでは一つずつ列挙しません。man
マニュアルで確認できます。最もよく使用されるのは と です_SC_PAGESIZE
。_SC_CLK_TCK
指定されたパラメータがname
無効な値の場合、sysconf()
関数は-1 を返し、errno
for を設定しますEINVAL
。それ以外の場合、返される値は
対応する構成値です。戻り値はlong
データの一種であることに注意してください。
使用例
ユーザーごとの最大同時プロセス数、システムティックレート、システムページサイズを取得します。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
printf("每个用户的最大并发进程数: %ld\n", sysconf(_SC_CHILD_MAX));
printf("系统节拍率: %ld\n", sysconf(_SC_CLK_TCK));
printf("系统页大小: %ld\n", sysconf(_SC_PAGESIZE));
exit(0);
}
操作結果:
sundp@sundongpeng:~/workspace/c_program/April$ gcc sysconf.c
sundp@sundongpeng:~/workspace/c_program/April$ ./a.out
ユーザーごとの最大同時プロセス数: 31581
システム ティック レート: 100
システム ページ サイズ: 4096