Linux 暫定版
1. 実験目的
proc ファイル システムを通じて Linux カーネルとシステム全体のいくつかの重要な機能を観察し、proc ファイル システムを使用してシステムのさまざまな構成パラメータを取得および変更するプログラムを作成します。
この実験では、Linux の基本的な操作スキルと C 言語でプログラムを作成できることが学生に求められます。
2. 実験内容
スーパー ユーザーとして Linux システムにログインし、/proc ディレクトリに入り、「ls」コマンドを入力してディレクトリの内容を表示し、各ファイルの読み取りおよび書き込み権限を確認します。
1. 次の質問に答えてください。
-
CPUの種類とモデル。
まず /proc ディレクトリに入り、ls コマンドを使用してディレクトリの内容を表示し、
次に cat cpuinfo コマンドを使用して CPU のタイプとモデルを表示します。
-
使用されている Linux のバージョン。
cat version コマンドを使用して Linux のバージョンを確認します。
-
起動から現在までの経過時間。
cat uptime コマンドを使用して、起動から現在の時点までの経過時間を表示します。
-
現在のメモリの状態。
cat meminfo コマンドを使用してメモリステータスを表示する
2. getinfo.c プログラムを作成してコンパイルし、コマンド ラインでコマンド パラメータを指定してプログラムを実行して、カーネル パラメータ (ネットワーク ホスト名、共有メモリ容量、ファイル ハンドルの最大パラメータなど) を取得して表示します。それらを画面上に表示します。
実行プロセスの例は次のとおりです (ファイル ハンドルの最大パラメータを取得します):
[root@Linux / ]# ./getinfo filemax
filemax : 18626
プログラミング
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
int main(int argc, char *argv[]){
if(argc != 2){
printf("Usage: %s <parameter>\n", argv[0]);
return 1;
}
char path[50] = "/proc/sys/fs/";
strcat(path, argv[1]);
int fd = open(path, O_RDONLY);
if(fd == -1){
perror("open error");
return 1;
}
char buffer[150];
int size = read(fd, buffer, sizeof(buffer));
if(size == -1){
perror("read error");
close(fd);
return 1;
}
buffer[size] = '\0';
close(fd);
printf("%s: %s", argv[1], buffer);
return 0;
}
プログラム分析
このプログラムは、システム カーネル内の特定のパラメータ値を読み取り、コンソールに出力できる単純な Linux システム コマンド ライン プログラムです。
まず、プログラムは入力パラメータの数が 2 かどうかを判断します。そうでない場合は、「使用法: プログラム名」を出力し、エラーを示す 1 を返します。パラメータの数が正しい場合、パラメータ値が文字列に追加され、文字列の先頭に「/proc/sys/fs/」が追加され、カーネルパラメータファイルを表すパスが取得されます。
次に、プログラムは open 関数を使用して結果のファイル パスを開き、ファイル記述子を返します。open関数の戻り値が-1の場合は、ファイルのオープンに失敗したことを意味するため、プログラムはエラーメッセージを出力し、エラーを示す1を返します。
次に、プログラムは read 関数を使用してファイルからデータを読み取り、そのデータを文字配列に格納します。read 関数の戻り値が -1 の場合、ファイルの読み取りが失敗したことを意味します。プログラムはエラー メッセージを出力し、ファイルを閉じ、エラーを示す 1 を返します。それ以外の場合、プログラムは読み取りデータの末尾にヌル文字を追加し、ファイルを閉じ、読み取りデータをコンソールに出力してプログラム機能を完了します。
一般に、このプログラムは、open、read、close などのシステム コール関数を使用して、カーネル パラメーターを読み取るための単純なコマンド ライン ツールを実装します。
演算結果
3. プログラム setsys.c を作成し、コンパイルして、コマンド ラインでコマンド パラメータを指定して実行し、カーネル パラメータを変更します (任意のパラメータを使用できます (ネットワーク ホスト名、共有メモリ容量、ファイル ハンドルの最大パラメータなど) .) ).
実行プロセス例は以下の通り:
[root@Linux / ]# ./setsys filemax
入力ファイルマックスパラメータ: 21545
注: 例中の波線部分がキーボード入力内容です 変更が成功したか確認してくださいgetinfo filemax を実行します。
プログラミング
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
int main(int argc, char *argv[]){
if(argc != 2){
printf("Usage: %s <parameter>\n", argv[0]);
return 1;
}
char path[50] = "/proc/sys/fs/";
strcat(path, argv[1]);
int fd = open(path, O_WRONLY);
if(fd == -1){
perror("open error");
return 1;
}
printf("Input %s parameter: ", argv[1]);
char buffer[20];
fgets(buffer, sizeof(buffer), stdin);
if(write(fd, buffer, strlen(buffer)) == -1){
perror("write error");
close(fd);
return 1;
}
close(fd);
printf("Set %s parameter to: %s", argv[1], buffer);
return 0;
}
プログラム分析
このプログラムは、システム カーネルに特定のパラメータ値を設定できる単純な Linux システム コマンド ライン プログラムです。
プログラムの最初のステップは、入力パラメータの数が 2 であるかどうかを判断することです。2 でない場合は、「Usage: プログラム名」を出力し、エラーを示す 1 を返します。パラメータの数が正しい場合、パラメータ値が文字列に追加され、文字列の先頭に「/proc/sys/fs/」が追加され、カーネルパラメータファイルを表すパスが取得されます。
次に、プログラムは open 関数を使用して結果のファイル パスを開き、ファイル記述子を返します。open関数の戻り値が-1の場合は、ファイルのオープンに失敗したことを意味するため、プログラムはエラーメッセージを出力し、エラーを示す1を返します。
次に、プログラムはユーザーに設定するパラメーター値の入力を求め、fgets 関数を使用してユーザーの入力を読み取り、ユーザーが入力した文字列をカーネル パラメーター ファイルに書き込みます。write 関数の戻り値が -1 の場合は、ファイルへの書き込みが失敗したことを意味するため、プログラムはエラー メッセージを出力してファイルを閉じ、エラーを示す 1 を返します。それ以外の場合、プログラムはファイルを閉じ、設定されたパラメータ値を出力してプログラム機能を完了します。
一般に、このプログラムは、open、write、close などのシステム コール関数を使用して、カーネル パラメータを設定するための単純なコマンド ライン ツールを実装します。
演算結果