関連原理と知識
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エディタを使用する基本的な手順は以下の通りです。
- viコマンドでvimエディタを開く
- aまたはiキーで編集モードに入る
- Escキーでコマンドラインモードに戻る
- :で行末コマンドモードに移行
- qまたはq!でvimを終了
- 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を使用してプログラムを追跡し、エラー時の出力を見ることで、具体的な問題点を特定しました。
問題のまとめ
- vimエディタに不慣れで、ファイルの保存や再開の方法がわからなかった。
- gccとstraceがインストールされていなかったため、「command not found」エラーが発生した。
- 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;
}