第65話 俺が低レベルな教えを乞うことにした件について
初めてのバイトから帰って来てからというもの、ネットなどを調べて、ライブラリとシステムコールの違いについては、なんとなくはわかってきたものの、肝心要の部分がよくわからない。
博士後期課程1年の
「で、ライブラリとシステムコールの違いを知りたい、と」
「はい。ネットの情報とかは見たんですけど、いまいちピンと来ないんですよ」
しばらく考え込んだあと、俊さんが言った。
「まず、高遠。C言語でファイルを1行読み込むプログラムを書けるか?」
「え、ええ。それくらいなら」
「じゃあ、書いてみせてくれ」
意図がわからなかったが、とりあえず言われた通りに、書いてみる。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 256
int main(void) {
FILE *fp;
char fname[] = "input.txt";
char line[SIZE] = {'\0'};
fp = fopen(fname, "r"); //ライブラリ
fgets(line, SIZE, fp); // ライブラリ
printf("line = %s", line);
fclose(fp); // ライブラリ
return 0;
}
これで、"input.txt"というファイルから1行読み込んで表示できる。
「ファイルが開けなかったときの事は考えてませんが……」
「いや、上出来だ。なら、ライブラリを使った方法は理解してるわけだ」
ふむふむとうなずく俊さん。
「なら、同じ事をシステムコールを使って書けるか?」
「え、いや。それがわからないから聞きに来たんですが」
「それもそうだな。じゃあ、試しに書いてみよう」
タタタ、とタイプして素早くプログラムを書き出す俊さん。動きに迷いがないあたり、さすがだ。
「よし、と。まあ手抜きだが、こんなものだろう」
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#define SIZE 256
int main(void) {
char* file = "input.txt";
int fd;
int count;
char buffer[SIZE];
fd = open(file, O_RDONLY); // システムコール
while((count = read(fd, buffer, 1)) > 0) {
if(strcmp(buffer, "\n") == 0) break; // システムコール
write(0, buffer, count); // システムコール
}
close(fd);
return 0;
}
俊さんが打ち込んだプログラムを眺める。
「で、この2つを比較すると、何か見えてこないか?」
「あ。ライブラリを使ったプログラムだとfgetsで「一行読み込む」が出来てますが、システムコールを使ったプログラムには見当たりませんね」
後者を見ると、ファイルに改行記号が来ているかどうかで判定をしているようだ。
「要はライブラリが「一行読み込む」というのを代わりにやってくれてるわけだ」
「言われてみると、納得です。ということは、逆にいうと、システムコールには「一行読み込む」という機能がない?」
「その通り。だから、fgets()で「一行読み込む」を代行してくれてるんだ」
「なるほど。だいぶ納得できてきました」
曖昧な説明だとどうにも納得できなかったが、コードを見るとその差は歴然だ。
「で、この、システムコールを実際に実行するのがOSの仕事だ」
「ようやく納得が行きました。ありがとうございます」
「お役に立てたなら何よりだ」
つっかえていたところがわかって、どこか晴れ晴れとした気分で家への道を歩く。そういえば、いつの間にか夜になっていたな。
「リュウ君、良かったね」
それまで、黙って話を聞いていたミユが、微笑んでそう言う。
「そういえば、置き去りにしてたな。ごめん」
「ううん。問題に真剣なリュウ君見てるのも楽しかったし、いいよ」
「それは助かる」
そう答えた後、ぐぎゅるーという腹の虫が鳴る。
「あ、晩ごはん食べるの忘れてた」
「リュウ君も夢中になると、食べるの忘れるよね」
「ミユもよく食べ忘れるよな」
「集中すると、ほんとに忘れるんだもん」
膨れっ面をするミユだが、機嫌は良さそうだ。
「とりあえず、すみ屋でも行くか」
「いいの?私、作るけど」
「今日は俺が奢るしさ」
「じゃあ、お言葉に甘えちゃおうかな」
というわけで、行き先を牛丼「すみ屋」に変更。とはいえ、歩いて10分かからないので近いものだ。
「はー。生き返る」
すみ屋にて。キムチ牛丼とお味噌汁をかきこんで、水を飲んで一息つく。
「集中した後のご飯って美味しいよね」
「そうだな。おまえも、徹夜でプログラムした後、ガツガツ食べてるよな」
「ガツガツって、そんな意地汚くないよー」
「いや、まさにガツガツって感じだったぞ」
徹夜でプログラムを書いていたミユを店に連れて行くと、それはもう凄い勢いで食べていたものだった。最近はあまり見ないが。
「なんていうか、もやもやとしたのが晴れるとほんとすっきりする」
「私も同感。ずっと悩んでいたのが嘘みたいな感じがするもんね」
家への道を歩きながら、語り合う。ミユの腕に俺は遥かに及ばないが、そのあたりの感覚は、プログラマー同士、共有できている。
「これで、ミユの足手まといにならずに済みそうだ」
「……やっぱり、気にしてたんだね」
やっぱり気づかれていたか。
「俺が勝手に気にしてるだけだから」
「そうなんだけど。もっと頼ってくれたって……」
「でも、プログラムはミユに任せても俺が上手くならないだろ」
「……!」
「ちょっと焦ってたんだ。ミユと対等になれるようにって」
仕事を任された当日に、というのは我ながら焦りすぎだと思うが。
「そっか。あ、ありがと」
何故だか、頬を赤らめてそんな事を言い出すミユ。
「別にお礼言われることじゃないと思うが?」
「私のために頑張ってくれたんでしょ?」
「まあ、な」
「やっぱり、ありがとうだよ。でも……」
「?」
「ううん。何でもない」
ぷい、と顔をそむけてしまうミユ。
機嫌が悪いわけじゃないと思うんだが、どうにも様子に違和感がある。喉の奥につかえていた疑問が取れて、清々しい気持ちだったのだが、どうにも釈然としないミユの様子に疑問を覚えながら帰宅したのだった。
帰省している間、欲求不満気味だったミユが何を考えているかも知らずに。
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます