ファイルコピーの基礎とstraceの使用

関連原理と知識

GNU CC(gcc)を使用してLinuxでプログラムをコンパイルする際の基本的なフローは以下の通りです。


プリプロセス
gcc -E hello.c -o hello.i

コンパイル
gcc -S hello.c

アセンブル
gcc -c hello.s

リンク
gcc -o hello hello.o

vimエディタ

vimエディタを使用する基本的な手順は以下の通りです。

  1. viコマンドでvimエディタを開く
  2. aまたはiキーで編集モードに入る
  3. Escキーでコマンドラインモードに戻る
  4. :で行末コマンドモードに移行
  5. qまたはq!でvimを終了
  6. wまたはw fileでバッファ内のファイルを保存

C言語でのファイルコピー

C言語を使用して、ファイルの内容を別のファイルにコピーするプログラムを作成します。このプログラムでは、ユーザーにソースファイルとターゲットファイルの名前を入力させ、必要なエラーチェックを行い、特にソースファイルが存在することを確認します。

straceの使用

straceは強力なLinuxコマンドラインツールであり、プログラムの診断とデバッグに使用されます。ユーザー空間のプロセスとカーネル間のインタラクション、システムコール、シグナルの送受信、プロセスの状態変更などを監視します。

実験過程

ファイルコピー機能

C言語の標準ライブラリ関数fopen, fgetc, fputcを使用してファイルをコピーします。プログラムはユーザーにソースファイルとターゲットファイルの名前を入力させ、それらのファイルを開き、ソースファイルから1文字ずつ読み取り、ターゲットファイルに書き込みます。

エラーチェック

エラーチェックでは、ソースファイルが存在するか、開けるか、ターゲットファイルが開けるかを確認します。ソースファイルが開けない場合は「ソースファイルを開けません」と表示し、ターゲットファイルが開けない場合は「ターゲットファイルを開けません」と表示し、それぞれの関数値を1として返します。コピーが成功した場合は「ファイルコピー成功!」と表示し、関数値0を返します。

strace

まず「sudo apt-get install strace」でstraceをインストールします。コードをcopy.cというファイルに保存し、「strace ./copy」でプログラムを実行し、その結果を観察します。より簡潔な出力を得るために、「strace -o output.txt ./copy」を使用して結果をoutput.txtに保存します。

実験結果と分析

WindowsとLinuxでテストを行った結果、正しいファイル名を入力するとファイルが正常にコピーされ、誤ったファイル名を入力するとエラーが発生しました。straceを使用してプログラムを追跡し、エラー時の出力を見ることで、具体的な問題点を特定しました。

問題のまとめ

  1. vimエディタに不慣れで、ファイルの保存や再開の方法がわからなかった。
  2. gccとstraceがインストールされていなかったため、「command not found」エラーが発生した。
  3. straceの出力が複雑で、エラー位置の特定が難しかった。

ソースコード


#include <stdio.h>

int main() {
    FILE *src, *dst;
    char srcName[100], dstName[100];
    char ch;

    printf("ソースファイル名を入力してください: ");
    scanf("%s", srcName);

    printf("ターゲットファイル名を入力してください: ");
    scanf("%s", dstName);

    src = fopen(srcName, "r");
    if (src == NULL) {
        printf("ソースファイルを開けません\n");
        return 1;
    }

    dst = fopen(dstName, "w");
    if (dst == NULL) {
        printf("ターゲットファイルを開けません\n");
        return 1;
    }

    ch = fgetc(src);
    while (ch != EOF) {
        fputc(ch, dst);
        ch = fgetc(src);
    }
    printf("ファイルコピー成功!\n");
    fclose(src);
    fclose(dst);

    return 0;
}

タグ: GNU CC Vim C言語 strace ファイル操作

7月14日 02:12 投稿