gccがインストールされているか確認
gcc -dumpversion >> 9
gccを使ったビルド
src配下にhello.cを書いた
ビルド
a.outが出来た
gcc src/hello.c ls >> a.out src
実行してみる
./a.out >> Hello, World!
gccを使ったビルド(2)
生成されるプログラムの名前を変更
gcc -o hello hello.c ./hello
コマンドライン引数
src/args.cを書いた。
argv[0]はコマンド名
オペレーティングシステム
- Linuxは以下3つで構成されている
- ファイルシステム
- プロセス
- ストリーム
- LinuxとはOSではなくカーネル(kernel, 核)が作り出している世界
- デバイス: 物理的な部品
- システムコール: カーネルに仕事を頼むために使う
- open, read, write, fork, exec, stat, unlinkなどなど
ライブラリ
- システムコール以外にも使える関数がライブラリ関数
- printf(), exit(), strlen(), strcpy()など
- ライブラリに収められているからライブラリ関数
- 関数をリンクしておくとその関数を呼び出すことができる
- 重要なのは標準cライブラリ
- 通称 libc
ファイルシステム
- 広義のファイル
- ls で表示された全て
- 狭義のファイル
- 内容がそのまま記録されているファイル
- 画像ファイル、動画ファイル、テキストファイルなど
- ディレクトリ
- 他のファイルを複数入れることが出来るファイル
- シンボリックリンク
- 他のファイルの名前を格納したファイル
- 主な使いみちは、ファイルやディレクトリに別名を付けること
- デバイスファイル
- デバイスをファイルとして表現したもの
- 例えば /dev/hda は1台目のハードディスクを表す
- mount コマンドで、現在使っているシステムがどのようなファイルシステムで構成されているか調べられる
プロセス
- 動作中のプログラムのこと
- ps ax でコンピュータに存在するプロセスがすべて表示される
- プロセスIDでプロセスを管理
- 同じプログラムを同時に実行してもプロセスIDで識別できる
ストリーム
- バイトストリーム
- バイト列が流れる通り道
- バイト列が出たり入ったりするものはなんでもストリーム
- キーボードは押下されたキーを表すバイトの列を送りつけてくるストリーム
- プロセスがファイルの内容にアクセスしたいとき
- ストリームからバイト列を取り出すことをread, バイト列を流し込むことをwriteという
- ストリームの両端にプロセスが付いているものをパイプと呼ぶ
- ストリームが別のコンピュータに伸びている場合はネットワーク通信となる
クレデンシャル
- 「ユーザーAとしてアクセスする」とは「ユーザーAの属性を持ったプロセスがアクセスする」こと
- Linux上で活動するのは常にプロセス
- プロセスの属性としてのユーザーのことをクレデンシャルと呼ぶ(信任状、証明書)
- ログインすると、証明書をもつプロセスがシステム上に作られ、別のコマンドを起動するときに自動的にコピーして渡されていく
端末
- 昔はコンピュータからの出力はプリンタで長い紙に打ち出されていた
- 入力は紙テープやタイプライター
- UNIXでは端末をttyと呼ぶが、由来は teletype
- Linuxでは物理的な端末がそのまま使われるわけではなく、仮想コンソールが間に挟まっている
- ソフトウェア的な端末
- コンソールは端末と同じような意味
- 端末に「a」を表示させるには
- 予めメモリ上に「a」を表現する画像を作っておき、文字と数値の対応からその数値を伝える
- 対応規則のうち、最も普及したのがASCII
- \007 を出力するとベルがなる
- コンソールで発生するコンッというやつ
- bell.c にサンプルコードを記述した
5章
ファイルディスクリプタ
- プログラムからストリームを扱うために使うもの
- プログラムから見るとただの整数値
- ストリームをプロセスに直接見せるわけにはいかない(様々な理由がある)
- カーネルが持っているストリームを番号と対応付けて、プロセスには番号でストリームを指定させる
stdin, stdout, stderr
- 普通にシェルからプロセスが起動された場合、どのプロセスにも3つのストリームが用意され、それに対応するファイルディスクリプタも固定されている
- 標準入力、標準出力、標準エラー出力
- 標準とはデフォルトの意
- 例えばcatコマンド
- 標準入力は端末(キーボードからの入力)
- 標準出力も端末(モニターへの出力)
- ファイルをcatコマンドにリダイレクト
- 標準入力はファイル
- 標準出力は端末
- catコマンドはどこから出力内容を読み込んでいるかは知らない(シェルがやっている)
- 例えばcatコマンド
- 多くのLinuxコマンドが統一的に「標準入力から読み込んで標準出力に書き込む」というルールに従っている
- コマンドを組み合わて複雑な処理を行うことが可能
voidとは?(雰囲気だけ)
- ポインタ変数
- void * buf みたいなやつ
- voidは型がないことを示す
- 変数定義には必ず型と変数名が必要
- が型、buf が変数名
- ポインタ変数なので参照先のメモリにアクセスしたい
- void は参照先の型
- https://monozukuri-c.com/langc-pointer-interpretation/
- https://monozukuri-c.com/langc-funclist-void/