[オペレーティング システム] 実験 1 Linux 暫定版

Linux 暫定版

1. 実験目的

proc ファイル システムを通じて Linux カーネルとシステム全体のいくつかの重要な機能を観察し、proc ファイル システムを使用してシステムのさまざまな構成パラメータを取得および変更するプログラムを作成します。
この実験では、Linux の基本的な操作スキルと C 言語でプログラムを作成できることが学生に求められます。

2. 実験内容

スーパー ユーザーとして Linux システムにログインし、/proc ディレクトリに入り、「ls」コマンドを入力してディレクトリの内容を表示し、各ファイルの読み取りおよび書き込み権限を確認します。
1. 次の質問に答えてください。

  • CPUの種類とモデル。
    まず /proc ディレクトリに入り、ls コマンドを使用してディレクトリの内容を表示し、
    次に cat cpuinfo コマンドを使用して CPU のタイプとモデルを表示します。
    1
    2

  • 使用されている Linux のバージョン。
    cat version コマンドを使用して Linux のバージョンを確認します。
    3

  • 起動から現在までの経過時間。
    cat uptime コマンドを使用して、起動から現在の時点までの経過時間を表示します。
    4

  • 現在のメモリの状態。
    cat meminfo コマンドを使用してメモリステータスを表示する
    5

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 などのシステム コール関数を使用して、カーネル パラメーターを読み取るための単純なコマンド ライン ツールを実装します。

演算結果

6

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 などのシステム コール関数を使用して、カーネル パラメータを設定するための単純なコマンド ライン ツールを実装します。

演算結果

7

おすすめ

転載: blog.csdn.net/m0_68111267/article/details/133145097